为什么SQL Server允许这种JOIN语法?

时间:2015-09-16 19:53:19

标签: sql sql-server select 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 Server中运行的。我期待语法错误。

我通常会这样编码:

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 Server允许这两种查询语法。顶部查询似乎具有对TABLE1和TABLE2的冗余引用。

为什么query1有效?

query1中使用的语法是否有名称?

2 个答案:

答案 0 :(得分:4)

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

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

因此,在您的第一个代码段中,您将table1表与别名table1加在table2上,别名为table2。这些别名毫无意义,但并非违法。

答案 1 :(得分:2)

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

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;

换句话说,您可以对表别名使用任何字符串,甚至是表名。冗余,但SQL Server和基本上所有其他数据库都允许。