Когда использую конструкцию where exist and not exist, sql игнорирует мои where
Имею такой запрос, используя запрос ниже пытаюсь получить записи которые имеют в таблице один значения column1 = 3, column2 = 0, column3 = 0, и соответственно в связанной таблице либо имеет значение 111, либо чтобы запись была не связанная через pivot. В результате запроса, получается такая картина, что where exist отрабатывает, а вот поиск по колонкам column1, column2, column3 не срабатывает. Прошу помочь решить данную проблему, спасибо.
select * from table1 where column1 = 3 and column2 = 0 and column3 = 0 and not exists (select * from table3 inner join table_pivot on table3.id = table_pivot.license_column where table1.id = table_pivot.system_id) or exists (select * from table3 inner join table_pivot on table3.id = table_pivot.license_column where table1.id = table_pivot.system_id and license_column = 111)
Ответы (1 шт):
Если я правильно понял суть вопроса, поставьте скобки:
select ... where ... and (not exists ... or exists ...)
Без скобок получается, что and срабатывает только между вашим условием на колонки и not exists, а условие exists проверяется само по себе и если оно выполнено, то строка попадает в выборку, условие на колонки не проверяется, т.е. получается как будто скобки стоят так:
select ... where (... and not exists ...) or exists ...
Это получается в частности потому, что у "логического и" and приоритет выше, чем у "логического или" or.