【问题标题】:Postgres SQL inner join syntaxPostgresql 内连接语法
【发布时间】:2016-03-14 11:21:51
【问题描述】:

谁能解释一下下面 SQL 中的内连接语法:

 CREATE TABLE dataset AS 
  SELECT property.id 
       , amount.band
       , amount."value"
 FROM property  
 INNER JOIN (locality INNER JOIN amount ON locality.code = amount.code) ON (property.band = amount.band) AND (property.id = locality."UniqueId")

为什么表locality 是在第二个内连接之前定义的?我从来没有遇到过这么奇怪的语法。

是否有更清晰的方法来纠正相同的查询,以便人们可以轻松理解发生了什么?

【问题讨论】:

  • 这种语法不是 Postgres 特有的。 SQL 标准允许这样做,我在 SQL Server 中也看到了这一点——尽管我从来不理解以这种方式进行连接的好处。
  • 该语法已从 SQL-2003 或 SQL-2008 中的 ANSI SQL 标准中删除。 BTW,value是保留字,需要用“value”分隔。
  • ... INNER JOIN (SELECT * FROM locality INNER JOIN ...

标签: sql postgresql inner-join


【解决方案1】:
FROM property  
  INNER JOIN (locality INNER JOIN amount ON locality.code = amount.code)
     ON (property.band = amount.band) AND (property.id = amount."UniqueId")

相同
FROM property  
  INNER JOIN amount ON property.band = amount.band AND property.id = amount."UniqueId"
  INNER JOIN locality ON locality.code = amount.code

仅当INNER JOINs 时,您可以根据需要重新排序。

(JOIN locality 的任何具体原因?您不选择它的任何列。它是某种EXISTS,或者如果该表中有多个匹配行,您是否希望返回多行?)

【讨论】:

  • 我已经更新了原来的 sql - 应该是 (property.id = locality."UniqueId")。这是否意味着我需要将AND 移动到本地连接?
  • @ozzii,是的,移动那个条件。 (不允许在连接链中尚未指定的表上使用 ON 条件。从左到右阅读。)
猜你喜欢
  • 2012-04-29
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多