2012-10-19 66 views
1

我有一個查詢:優化與UNION JOIN不工作

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' 

但我得到不同的結果!任何想法爲什麼?

謝謝!

+0

爲了得到不涉及巨大的假設回答,請出示樣本數據演示你的意思是* *通過*** ***不同。 – MatBailie

回答

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' 
+0

+1:很好的地方。 「AND」在一條新線上欺騙了我,把它想成是一個WHERE條款。 – MatBailie

+0

我其實是想出來,只是要回答這個問題:)這就是它實際上,我在第一個查詢中得到的結果錯了。預期的優化也修復了數據! –

0

UNION將加入結果集並刪除重複項。嘗試UNION ALL

select 1 as ID 
UNION 
SELECT 1 as ID 

結果1

select 1 as ID 
UNION ALL 
SELECT 1 as ID 

結果1和1