Подзапрос в предложении WHERE вместе с другими условиями - PullRequest
0 голосов
/ 10 октября 2018

Интересно, почему 2 запроса независимо выполняются нормально, и когда они объединяются в клубы, переводит запрос в бесконечный цикл

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 голосов
/ 10 октября 2018

Проблема, с которой вы сталкиваетесь, связана с оптимизацией.Решение состоит в том, чтобы разделить запросы на компоненты.Лучший способ выразить это:

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), чтобы по-прежнему получить оптимальный план.

0 голосов
/ 10 октября 2018

Попробуйте использовать 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
...