Почему Select Query by Restriction Not IN не может выполняться нормально, а Restriction IN может работать нормально? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь выбрать некоторые данные материала из одной таблицы, и у меня есть одно ограничение: материал не должен существовать в одном представлении.

Итак, ниже приведен мой код.Он не может быть выполнен нормально.

select *
from Table A
where Table A.Material not in (select View A.material from View A)

Этот запрос всегда выполняется и выполняется с течением времени.Но если я использую Restriction IN, он может выполняться нормально.

select *
from Table A
where Table A.Material in (select View A.material from View A)

Чтобы получить целевые данные, я использую приведенный ниже код, и он работает.

select *
from Table A
where Table A.Material not in (select *
                               from Table A 
                               where Table A.Material in (select View A.material from View A)
                              )

Это странно, поэтомугде проблема для моего исходного кода?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Возможно, у вас есть NULL-ы в ViewA.material. Другой способ решить вашу проблему:

select * from TableA where TableA.Material not in (select ViewA.material from ViewA where ViewA.material IS NOT NULL)

Предположим, что ViewA.material имеет значения 1, 2 и NULL. Запрос с IN будет эквивалентен:

select * from TableA where Material=1 OR Material=2 OR Material=NULL

Даже если TableA будет содержать строку с NULL, условие Material=NULL не будет истинным, поскольку NULL = NULL неизвестно (по крайней мере, при настройке по умолчанию и рекомендуемой настройке SET ANSI_NULLS ON). Однако TRUE OR unknown создает TRUE, поэтому этот запрос дает правильные результаты.

Запрос с NOT IN будет эквивалентен:

select * from TableA where Material<>1 AND Material<>2 AND Material<>NULL

В этом случае TRUE AND unknown выдает unknown, поэтому этот запрос никогда не вернет никаких результатов.

0 голосов
/ 26 июня 2019

Это вопрос NOT IN, он вызывает некоторые проблемы: Это 1-я ссылка: https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/
И это еще одно обсуждение в этой теме: https://dba.stackexchange.com/questions/121034/best-practice-between-using-left-join-or-not-exists

Это может быть потому, что выВы используете ВИД, а не СТОЛ.TABLE, вероятно, имеет индексы, а VIEW - нет, и здесь вы теряете оптимизацию с помощью движка.Если вы попытаетесь увидеть план , вы, вероятно, довольно быстро увидите, что происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...