为什么 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 服务器和基本上所有其他数据库都允许。
我刚刚从 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 服务器和基本上所有其他数据库都允许。