我有一个问题:
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)
但我得到了不同的结果!知道为什么吗?
谢谢!
你的问题是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)