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

2つ目は以下に相当します。

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 に答える