postgresql - 内连接和外连接;表格的顺序重要吗?

标签 postgresql

为什么在组合外连接和内连接时表的顺序很重要? postgres 以下失败:

SELECT grp.number AS number,     
       tags.value AS tag   
FROM groups grp,
     insrel archiverel  
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber   
WHERE archiverel.snumber = 11128188 AND    
      archiverel.dnumber = grp.number 

结果:

ERROR:  invalid reference to FROM-clause entry for table "grp" LINE 5: LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.d... 
^ HINT:  There is an entry for table "grp", but it cannot be referenced from this part of the query.

当组在 FROM 中反转时,一切正常:

SELECT  grp.number AS number,     
        tags.value AS tag   
FROM    insrel archiverel,
        groups grp
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber   
WHERE   archiverel.snumber = 11128188 AND    
        archiverel.dnumber = grp.number 

最佳答案

我相信您可以将此视为运算符优先级问题。

当你这样写的时候:

FROM groups grp,
     insrel archiverel  
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber   

我认为解析器是这样解释的:

FROM groups grp,
(
  (
     insrel archiverel  
     LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
  )
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
)

如果是这样,那么在最里面的连接中“grp”是未绑定(bind)的。

当您用“groups”和“insrel”反转行时,最内层的联接适用于“groups”和“ownrel”,因此它有效。

可能这也行:

    FROM groups grp
         JOIN insrel archiverel  ON archiverel.dnumber = grp.number
    LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
    LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber 
WHERE archiverel.snumber = 11128188

关于postgresql - 内连接和外连接;表格的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/187146/

相关文章:

sql - 创建表时出现postgresql语法错误

ruby-on-rails - PGError : ERROR: unrecognized time zone name: "UTC"

postgresql - 使用 CURRENT_DATE 的查询返回 0 个条目

postgresql - 从另一个表复制权限

PostgreSQL 查询有效但不适用于 php

postgresql - 包含顺序对覆盖索引有任何影响吗?

sql - 如何计算某个值之前有多少行?

json - PostgreSQL 导入工具 (RDF/JSON/CSV)

postgresql - 使用 Coldfusion 从 Postgres 存储和检索图像

javascript - 在父子关系中打印数组