Проблема с использованием IN в SQL - PullRequest
0 голосов
/ 09 июня 2009


Не могли бы вы помочь мне понять, в чем проблема?

SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec

Выше скрипт возвращает набор записей, где запись с p_Services = 200000000000115 не существует

SELECT mz_t_Services.p_ID from mz_t_Services

Выше скрипт возвращает набор записей, где существует запись с id = 200000000000115
Но этот запрос не возвращает запись

SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec)

Я использую MSSQL
EDIT:
Типы данных p_ID и p_Services ara bigint

Ответы [ 3 ]

4 голосов
/ 09 июня 2009

Есть ли в mz_t_NaznExec.p_Services значения NULL? «NOT IN» всегда будет неудачным, если в наборе результатов будет хотя бы один NULL.

1 голос
/ 09 июня 2009
SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT ISNULL(mz_t_NaznExec.p_Services,0) FROM mz_t_NaznExec)

или лучше

SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec WHERE mz_t_NaznExec.p_Services is not null)
0 голосов
/ 09 июня 2009

Это также будет работать:

SELECT p_id
  FROM mz_t_services
 WHERE NOT EXISTS
       ( SELECT 1
           FROM mz_t_naznexec
          WHERE mz_t_naznexec.p_services = mz_t_services.p_id
       )

Я предпочитаю его вышеуказанным решениям, потому что он более надежно использует индексы (по моему опыту). Он работает независимо от того, присутствуют ли значения NULL или нет, поэтому вы можете просто использовать эту форму все время, независимо от ваших ожиданий относительно содержимого таблицы, и не беспокоиться о том, что люди спрашивают вас, почему вы проверяете значения NULL в столбце, который не Позвольте им.

В любом случае, вам следует попробовать оба решения и посмотреть, какое из них лучше для вас.

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