postgresql – 内连接和外连接;表中的顺序是重要吗?

前端之家收集整理的这篇文章主要介绍了postgresql – 内连接和外连接;表中的顺序是重要吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么组合顺序是重要的?内连接?
以下失败与postgres:
  1. SELECT grp.number AS number,tags.value AS tag
  2. FROM groups grp,insrel archiverel
  3. LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
  4. LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
  5. WHERE archiverel.snumber = 11128188 AND
  6. archiverel.dnumber = grp.number

结果是:

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

当这些组在FROM中相反时,它们都可以工作:

  1. SELECT grp.number AS number,tags.value AS tag
  2. FROM insrel archiverel,groups grp
  3. LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
  4. LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
  5. WHERE archiverel.snumber = 11128188 AND
  6. archiverel.dnumber = grp.number
我相信你可以把它看作一个运算符优先级问题。

当你写这个:

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

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

  1. FROM groups grp,(
  2. (
  3. insrel archiverel
  4. LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
  5. )
  6. LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
  7. )

如果是这样,那么在最内层的连接“grp”是没有绑定的。

当您使用“groups”和“insrel”反转行时,最内层的连接适用于“groups”和“ownrel”,因此它可以正常工作。

这可能也会奏效:

  1. FROM groups grp
  2. JOIN insrel archiverel ON archiverel.dnumber = grp.number
  3. LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
  4. LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
  5. WHERE archiverel.snumber = 11128188

猜你在找的Postgre SQL相关文章