WHERE子句中的子查询以及其他条件

时间:2018-10-10 14:06:58

标签: sql sql-server subquery where-clause

奇怪为什么两个查询可以独立执行,并且当合并在一起时会使查询陷入无限循环

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

任何帮助表示赞赏。

谢谢

2 个答案:

答案 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),以获得最佳计划。