2016-11-19 33 views
1

我一直在尋找像SQLite會提升不變約束嗎?

https://forums.asp.net/t/1887910.aspx?Inner+join+2+tables+but+return+all+if+1+table+empty

有人類似的問題的解決方案提出了類似下面

SELECT 
    * 
FROM 
    TableA AS a 
    LEFT JOIN TableB AS b ON b.A_Id = a.A_Id 
WHERE 
    b.A_Id IS NOT null 
    OR 
    NOT EXISTS (SELECT TOP 1 A_Id FROM TableB) 

的解決方案是否SQLite的運行not exists (select top 1 A_Id from TableB)每一行?對於所有行,這種情況應該是相同的。我想知道查詢引擎是否可以將它提升到最高點。否則,這將花費很多成本。

我嘗試以下

EXPLAIN QUERY PLAN 
select test.testID, test.name, parameter.name 
from test 
left join parameter 
on test.testID = parameter.testID 
where 
    parameter.testID is not null 
    or not exists (select testId from parameter limit 1) 

據報道

selectid order form detail 
0   0  0  SCAN TABLE test (~1M rows) 
0   1  1  search table parameter using automatic covering index (testID=?) (~ 7 rows) 
0   0  0  EXECUTE SCALAR SUBQUERY 1 
1   0  0  SCAN TABLE parameter (~1M rows) 

這是否意味着SQLite不葫蘆(select testId from parameter limit 1)

+1

對其運行「EXPLAIN QUERY PLAN」以查看其功能:https://sqlite.org/eqp.html – Thilo

+0

這不是「約束」 - 這是一個相關子查詢。 – Dai

+0

這個查詢意味着什麼返回?它看起來應該是'INNER JOIN',儘管我不明白'NOT EXISTS'子查詢是用來完成什麼的。 – Dai

回答

0

的​​3210說:

甲相關每次需要它的結果時間子查詢重新評估。不相關的子查詢只評估一次,並根據需要重新使用結果。

您的子查詢不相關,因爲它不包含對外部查詢中列的引用。 (並且EXPLAIN QUERY PLAN輸出將顯示EXECUTE CORRELATED SCALAR SUBQUERY ...。)

+1

解釋查詢計劃顯示'EXECUTE SCALAR SUBQUERY 1',但並不說明它是否相關。我不認爲它是相關的。 –