Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 3

NOT EXISTS sprawdza, czy podzapytanie zwraca pustą tabelę (nie znalazło żadnych pasujących rekordów), NOT IN weryfikuje zgodność we wszystkich jego wierszach.

I tu może mała dygresja, bo coś mi się widzi, że tego dotyczyło sedno pytania - NOT IN nie powinno się używać do łączenia tabel! Weźmy prosty przykład z dwiema jednokolumnowymi tabelami: t1.id={1,2,3,4,5,6} i t2.id={1,2,3,null,5}.

1) Kwerenda:

SELECT t1.* FROM t1
WHERE NOT EXISTS (SELECT t2.* FROM t2 WHERE t1.id=t2.id);

Zwróci nam oczekiwane id={4,6}, bo dla tych wartości wewnętrzny SELECT był pusty.

2) Kwerenda:

SELECT t1.* FROM t1
WHERE t1.id NOT IN (SELECT t2.id FROM t2);

Na pierwszy rzut oka powinna dać ten sam wynik, ale... nie zwróci nic. W skrócie dzieje się tak, ponieważ gdy trafimy na porównanie z null, operator NOT IN otrzymuje wynik UNKNOWN i cały warunek zostaje odrzucony. Warto o tym pamiętać!

PS: NOT EXISTS powinien być też wydajniejszy. :)

Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 31.07.2017
    • 1
    • 7
    • 1
Komentarze
Dzięki
Skomentował : @ Łukasz_Szacherski ,02.08.2017
  • 21
  • 4
  • 32