奇怪为什么两个查询可以独立执行,并且当合并在一起时会使查询陷入无限循环
select * from TableA
where TableA.ColumnA NOT IN (subquery..) --> EXECUTES FINE
select * from TableA
where TableA.ColumnA IS NULL OR TableA.ColumnA = 0 --> EXECUTES FINE
但是,当上面的查询组合在一起时,查询会陷入无限循环
select * from TableA
where TableA.ColumnA NOT IN (subquery..) OR TableA.ColumnA IS NULL OR
TableA.ColumnA = 0
任何帮助表示赞赏。
谢谢
答案 0 :(得分:1)
尝试使用UNION ALL
select * from TableA
where TableA.ColumnA NOT IN (subquery..) --> EXECUTES FINE
AND TableA.ColumnA <> 0
UNION ALL
select * from TableA
where TableA.ColumnA IS NULL OR TableA.ColumnA = 0 --> EXECUTES FINE
答案 1 :(得分:0)
您面临的问题是优化之一。解决方案是将查询分为多个组件。最好的表达方式是:
select a.*
from TableA a
where a.ColumnA <> 0 and a.ColumnA NOT IN (subquery..) -- I actually recommend `not exists`
union all
select a.*
from TableA a
where a.ColumnA IS NULL OR a.ColumnA = 0 ;
第一个查询中的条件a.ColumnA <> 0
确保两个子查询返回不同的集合-因此您可以使用union all
而不是union
。使用and
仍应允许此子查询以与原始查询相同的方式进行优化。如果执行计划发生变化,则可以以不同的方式表达逻辑(例如在子查询中或使用not exists
),以获得最佳计划。