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”,但没有说明它是否相关。我不认为这是相关的。