为什么 SQL 服务器允许这种 JOIN 语法?

Why does SQL Server allow this JOIN syntax?

我刚刚从 Cognos Report Studio 中生成了一些 SQL。我已经对表和字段进行了清理,但将结构保留在原位。下面是生成的 Native SQL:

SELECT DISTINCT TABLE1.FIELD1
FROM TABLE1 
TABLE1 LEFT OUTER JOIN TABLE2 
TABLE2 ON TABLE1.KEY1 = TABLE2.KEY1
WHERE TABLE2.FLAG1 = 0 
AND TABLE1.FLAG2 = 0 
AND TABLE1.FLAG3 = 0 
AND TABLE2.FLAG4 = 0
AND TABLE2.FLAG5 = 0

令我惊讶的是,上述语法实际上在 SQL 服务器中运行。我期待语法错误。

我通常这样编码:

SELECT DISTINCT TABLE1.FIELD1
FROM TABLE1 
/*TABLE1*/ LEFT OUTER JOIN TABLE2 
/*TABLE2*/ ON TABLE1.KEY1 = TABLE2.KEY1
WHERE TABLE2.FLAG1 = 0 
AND TABLE1.FLAG2 = 0 
AND TABLE1.FLAG3 = 0 
AND TABLE2.FLAG4 = 0
AND TABLE2.FLAG5 = 0

上面的语法也可以运行,但我预计它会运行。

所以,我很好奇为什么 SQL 服务器允许这两种查询语法。最上面的查询似乎有对 TABLE1 和 TABLE2 的冗余引用。

为什么 query1 有效?

查询 1 中使用的语法有名称吗?

连接的一般形式如下([] 表示可选部分,像往常一样):

SELECT col1, col2, ...
FROM   table1 [table1 alias]
[LEFT] [OUTER] JOIN table2 [table2 alias]
[WHERE ...]

因此,在您的第一个片段中,您将 table table1 与别名 table1 连接到 table2 与别名 table2。这些别名毫无意义,但并不违法。

如果您使用更简单的 table 别名,您的查询将更容易编写和阅读:

SELECT DISTINCT T1.FIELD1
FROM TABLE1 T1 LEFT OUTER JOIN
     TABLE2 T2
     ON T1.KEY1 = T2.KEY1
WHERE T2.FLAG1 = 0 AND
      T1.FLAG2 = 0 AND
      T1.FLAG3 = 0 AND
      T2.FLAG4 = 0 AND
      T2.FLAG5 = 0;

换句话说,您可以使用任何字符串作为 table 别名,甚至是 table 名称。冗余,但 SQL 服务器和基本上所有其他数据库都允许。