我一直在寻找像
这样类似问题的解决方案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)
?
答案 0 :(得分:0)
每次需要结果时,都会重新评估相关子查询。不相关的子查询仅评估一次,并在必要时重复使用结果。
您的子查询不相关,因为它不包含对外部查询中的列的引用。 (并且EXPLAIN QUERY PLAN输出将显示EXECUTE CORRELATED SCALAR SUBQUERY ...
。)