NOT IN Вяртае Нечаканыя вынікі

Я бягу наступныя запыты ў MS SQL Server (версія 2016, калі гэта мае значэнне).

SELECT DISTINCT Job_Number
FROM table_A
WHERE Job_Number IS NOT NULL

вяртае 2376 радкоў

SELECT *
FROM table_A
WHERE Job_Number IN (SELECT DISTINCT [House Bill] FROM table_B)

вяртае 137 радкоў

Тым не менш,

SELECT *
FROM table_A
WHERE Job_Number NOT IN (SELECT DISTINCT [House Bill] FROM table_B)`

вяртае 0 радкоў. Я хацеў бы чакаць, што гэта будзе вяртаць 2239 радкоў (г.зн. 2376 - 137).

Ці ёсць фундаментальная канцэпцыя не ў тым, у мяне ёсць яшчэ зразумець тут?

0

5 адказы

NOT IN will fail to return results if there are any NULL values returned by your following query: (SELECT DISTINCT [House Bill] FROM table_B)

Мая прапанова змяніць запыт на:

<�Код> (SELECT DISTINCT [House Bill] FROM TABLE_B WHERE [House Bill] IS NOT NULL)

Прычына гэта адбываецца таму, што кожны раз, калі параўнанне паміж радку ў TABLE_A з NULL значэнне ў TABLE_B лагічны вынік НЕВЯДОМЫ .

Там больш інфармацыі аб гэтым:

1 - here and

2 - тут

1
дададзена

IN doesn't take NULL into consideration... try this instead, which checks for both...

SELECT *
FROM table_A
WHERE Job_Number IS NULL
  OR Job_Number NOT IN (SELECT DISTINCT [House Bill] FROM table_B)

(Вельмі нязначнае заўвагу, але я б настойліва рэкамендуем вам не ёсць прабелы ў імёнах сутнасцяў ... замест [Дом Біла] Я хацеў бы выкарыстаць нешта накшталт < код> House_Bill або HouseBill )

0
дададзена

<�Код> IN() падзел ігнаруе NULL значэння.

0
дададзена

NOT IN returns no rows at all if the subquery returns NULL -- even once.

Па гэтай прычыне я настойліва рэкамендую выкарыстоўваць НЕ ІСНУЕ . Гэта вядзе сябе, як вы чакаеце:

SELECT a.*
FROM table_A a
WHERE NOT EXISTS (SELECT 1 NFROM table_B b WHERE a.Job_Number = b.[House Bill])
0
дададзена

Магчымая прычына будзе Null <�код /> значэння ў TableB у [Дом Біла] Калонка:

Правільны шлях будзе выкарыстоўваць НЕ ІСНУЕ АБО EXISTS замест NOT IN І IN п:

SELECT a.*
FROM table_A a
WHERE NOT EXISTS (SELECT 1 FROM table_B b WHERE a.Job_Number = b.[House Bill]);
0
дададзена