SQLite会提升不变约束吗?

SQLite会提升不变约束吗?,sqlite,Sqlite,我一直在寻找类似问题的解决方案,比如 有人提出了如下解决方案 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) EXPLAIN QUERY PLAN select test.testID, test.name, parame

我一直在寻找类似问题的解决方案,比如

有人提出了如下解决方案

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)
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)
SQLite运行不存在吗?请从表B中为每行选择前1个A_Id?对于所有行,此条件应相同。我想知道查询引擎是否可以将其提升到最顶端。否则,将花费大量成本

我尝试了以下方法

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)
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没有从参数限制1中选择testId?

说明:

每次需要相关子查询的结果时,都会重新计算相关子查询。不相关的子查询只计算一次,并根据需要重用结果

子查询不相关,因为它不包含对外部查询中列的引用。EXPLAIN查询计划输出将显示EXECUTE CORRELATED SCALAR SUBQUERY…

表示:

每次需要相关子查询的结果时,都会重新计算相关子查询。不相关的子查询只计算一次,并根据需要重用结果


子查询不相关,因为它不包含对外部查询中列的引用。解释查询计划输出将显示“执行相关标量子查询…”

对其运行解释查询计划以查看其功能:这不是约束-它是相关子查询。此查询要返回什么?看起来它应该是一个内部联接,尽管我不明白NOT EXISTS子查询要完成什么。@Dai,我想内部联接A和B。当B为空时,我想得到A。比如:这必须在一个查询中完成吗?为什么不先查看表是否为空,然后选择“全部”或“关联数据”?正常的左连接不够好吗?区别在于,即使另一个表不是空的,也会得到不匹配的行。但您可以判断它是否是匹配行。对其运行解释查询计划以查看其功能:这不是约束-它是相关子查询。此查询要返回什么?看起来它应该是一个内部联接,尽管我不明白NOT EXISTS子查询要完成什么。@Dai,我想内部联接A和B。当B为空时,我想得到A。比如:这必须在一个查询中完成吗?为什么不先查看表是否为空,然后选择“全部”或“关联数据”?正常的左连接不够好吗?区别在于,即使另一个表不是空的,也会得到不匹配的行。但您可以判断它是否是匹配行。解释查询计划显示“执行标量子查询1”,但不说明它是否相关。解释查询计划显示“执行标量子查询1”,但没有说明它是否相关。我不认为这是相关的。