【发布时间】:2013-11-22 12:31:47
【问题描述】:
我运行 SQL Server 2008 并尝试执行以下 SQL 查询:
查询 1:
SELECT *
FROM tableA
LEFT OUTER JOIN tableB AS tabX ON tabX.some_id = tableA.some_id
LEFT OUTER JOIN tableB AS tabY ON tabY.some_id = tableA.some_id
WHERE tabX.some_attribute = 'X'
AND tabY.some_attribute = 'Y'
我已经知道WHERE 语句之后的条件确实会弄乱LEFT OUTER JOIN 并且通常使其表现得像经典的INNER JOIN。有趣的是,在 SQL Server 2005 上并非如此。
要修复它,我可以这样做:
查询 2:
SELECT *
FROM tableA
LEFT OUTER JOIN tableB AS tabX ON tabX.some_id = tableA.some_id AND tabX.some_attribute = 'X'
LEFT OUTER JOIN tableB AS tabY ON tabY.some_id = tableA.some_id AND tabY.some_attribute = 'Y'
基本上我必须在ON 语句中包含WHERE 条件,并且查询将按照预期的方式执行。
我的第一个问题是: 为什么 SQL Server 不能以相同的方式解释这两个查询(就像旧版 SQL Server 或 Oracle DBServer 那样)?
我之所以问,是因为我对第一个查询的条件(在WHERE 语句之后)如何以及为什么会影响主要逻辑库(我的意思是“主要结果”)感到困惑。特别是因为这两个条件都专门指别名 tabX 和 tabY
我的第二个问题是:我能以某种方式改变这种行为吗? (例如在服务器配置中?)
最好的问候, 彼得
【问题讨论】:
标签: sql-server sql-server-2008 left-join where