Проблема, с которой вы сталкиваетесь, связана с оптимизацией.Решение состоит в том, чтобы разделить запросы на компоненты.Лучший способ выразить это:
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
), чтобы по-прежнему получить оптимальный план.