我刚从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中使用的语法是否有名称?
答案 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和基本上所有其他数据库都允许。