sql - 在一个查询中对多个表进行多个左连接

标签 sql postgresql join left-join multiple-tables

我有一个 master 表,其中的项目存储在多个级别,父级和子级,还有第二个表可能有也可能没有额外的数据。我需要从我的主表中查询两个级别并在我的第二个表上进行左连接,但是由于我的查询中的顺序,这将不起作用。

SELECT something FROM master as parent, master as child
  LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id
  LEFT JOIN second as childdata ON child.secondary_id = childdata.id
WHERE parent.id = child.parent_id AND parent.parent_id = 'rootID'

左联接仅适用于 from 子句中的最后一个表,因此我只能使其适用于其中一个左联接。在上面的示例中,所有左连接都不起作用,因为第一个左连接指向 from 子句中的第一个表,第二个左连接永远不会像这样工作。

我怎样才能让它工作?

最佳答案

这种查询应该可以工作 - 在用显式 JOIN 语法重写之后:

SELECT something
FROM   master      parent
JOIN   master      child ON child.parent_id = parent.id
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  parent.parent_id = 'rootID';

这里的绊脚石是显式 JOIN 在逗号 (,) 之前绑定(bind),否则等同于 CROSS加入The manual here:

In any case JOIN binds more tightly than the commas separating FROM-list items.

在重写第一个之后,所有连接都是从左到右应用的(逻辑上 - 否则 Postgres 可以自由地重新排列查询计划中的表)并且它有效。

为了说明我的观点,这也行得通:

SELECT something
FROM   master parent
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
,      master child
LEFT   JOIN second childdata  ON childdata.id = child.secondary_id
WHERE  child.parent_id = parent.id
AND    parent.parent_id = 'rootID';

但是显式的 JOIN 语法通常更清晰。

请注意,多个 (LEFT) JOIN 可以乘以行:

关于sql - 在一个查询中对多个表进行多个左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260860/

相关文章:

mysql - MySql 中的 DATE_ADD 函数内的 IF

php sql更新加入

mysql - SQL Match Against query for Multiple tables 的性能问题

android - 在单个数据库字段中存储逐行数据

java - 一对多查询,同时基于不同的主键进行限制

postgresql - 避免 PostgreSQL 中的嵌套循环

mysql - Sql Join 查询的行结果

sql - 如何连接表,以便右表值取决于左表中的两个不同行

sql - 无法使用 .my.cnf 文件连接到数据库 pymysql

php - Laravel 迁移 Postgres 错误 SQLSTATE[08006]