SQLite会提升不变约束吗?

时间:2016-11-19 03:38:26

标签: 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 个答案:

答案 0 :(得分:0)

documentation说:

  

每次需要结果时,都会重新评估相关子查询。不相关的子查询仅评估一次,并在必要时重复使用结果。

您的子查询不相关,因为它不包含对外部查询中的列的引用。 (并且EXPLAIN QUERY PLAN输出将显示EXECUTE CORRELATED SCALAR SUBQUERY ...。)