使用UNION优化JOIN不起作用

Mos*_*aou 1 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'
Run Code Online (Sandbox Code Playgroud)

我试图优化它以获得更好的性能,所以我写道:

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'
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Ric*_*iwi 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'
Run Code Online (Sandbox Code Playgroud)

应该写的

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'
Run Code Online (Sandbox Code Playgroud)

指出不同.检查操作员优先(即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'
Run Code Online (Sandbox Code Playgroud)

第一个等同于

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'
Run Code Online (Sandbox Code Playgroud)