1

我有一个查询:

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'

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

谢谢!

4

2 回答 2

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'

指出不同。检查运算符优先级(即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'
于 2012-10-19T11:12:21.303 回答
0

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

select 1 as ID
UNION 
SELECT 1 as ID

结果 1

select 1 as ID
UNION ALL
SELECT 1 as ID

结果 1 和 1

于 2012-10-19T10:54:25.057 回答