PostgreSQL内部连接语法

3

请问有人能解释一下以下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?我从未遇到过这样奇怪的语法。

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


1
这个语法不仅适用于Postgres,它也被SQL标准允许,并且我也在SQL Server中看到过 - 尽管我从来没有理解用这种方式进行连接的好处。 - user330315
该语法在 ANSI SQL 标准中已于 SQL-2003 或 SQL-2008 中删除。另外,value 是保留字,需要用 "value" 进行定界。 - jarlh
... INNER JOIN (SELECT * FROM locality INNER JOIN ... - jarlh
1个回答

2
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 JOIN时,你可以按照需要重新排序。

(JOIN locality是有特殊原因吗?您没有选择它的任何列。这是某种EXISTS,还是如果该表中有多个匹配行,则要返回多行?)


我已经更新了原始的SQL语句 - 应该是(property.id = locality."UniqueId")。这是否意味着我需要将AND移到地区连接中? - adam78
@ozzii,是的,请移动那个条件。(不允许在连接链中尚未指定的表上具有ON条件。从左到右阅读。) - jarlh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接