使用UNION优化JOIN不起作用

时间:2012-10-19 10:48:10

标签: sql sql-server

我有一个问题:

SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ParentID or f1.ID = f2.ChildID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

我尝试对其进行优化以获得更好的性能,所以我写道:

SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ParentID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

UNION

SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ChildID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

但我得到了不同的结果!知道为什么吗?

谢谢!

2 个答案:

答案 0 :(得分:7)

您的问题是WHY are the results different

SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ParentID or f1.ID = f2.ChildID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

应该写的

SELECT * FROM foo f1
JOIN foo f2 ON (f1.ID = f2.ParentID or f1.ID = f2.ChildID)
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

发现差异。检查 OPERATOR PRECEDENCE (例如AND之前的OR

第二个等同于以下。

SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ParentID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'
UNION
SELECT * FROM foo f1
JOIN foo f2 ON f1.ID = f2.ChildID
AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

第一个等同于

SELECT ...
JOIN foo f2 ON f1.ID = f2.ParentID
-- **condition missing
UNION
SELECT ...
JOIN foo f2 ON f1.ID = f2.ChildID AND f2.CreateTime > 'YYYY-MM-DD 00:00:00.000'

答案 1 :(得分:0)

UNION将加入结果集并删除重复项。尝试联合所有

select 1 as ID
UNION 
SELECT 1 as ID

结果1

select 1 as ID
UNION ALL
SELECT 1 as ID

结果1和1