Mam więc dwie tabele, A i B, próbuję znaleźć wartości, które istnieją w kolumnie w tabeli A, które nie istnieją w pasującej kolumnie w tabeli B, mój bieżący kod to:

SELECT A.x
FROM A
WHERE A.x NOT IN (SELECT B.x FROM B);

Próbowałem też:

SELECT A.x
FROM A
WHERE EXISTS NOT (SELECT B.x FROM B);

Ale kiedy uruchamiam zapytanie, nic nie ma w tabeli, wiem na pewno, że w kolumnie „x” A są wartości, których nie ma w kolumnie „x” B, ale się tam nie pojawiają.

Mam wrażenie, że robię coś bardzo głupiego lub brakuje mi oczywistej odpowiedzi, ale jestem zbyt zmęczony i pracuję nad tym zbyt długo, żeby się tym przejmować, więc pozdrawiam za wszelką pomoc =)

2
Jarred Filmer 16 luty 2012, 17:18

2 odpowiedzi

Najlepsza odpowiedź

Czy próbowałeś użyć OUTER JOIN?

SELECT A.x
FROM A LEFT OUTER JOIN B ON A.x = B.x
WHERE B.x IS NULL
4
Yuck 16 luty 2012, 17:21

Czy w B.x może znajdować się wartość null? Jeśli tak, not in brzmi następująco:

a.x not in (1, 2, 3, null, ...)

Co jest skrótem dla:

a.x <> 1 and a.x <> 2 and a.x <> 3 and a.x <> null and ...

Ponieważ anything <> null oblicza unknown, warunek not in nigdy nie jest prawdziwy. Wynikiem jest pusty zestaw wierszy. To nieprzyjemny efekt uboczny trzech cenionych logiki, który zaskakuje nawet doświadczonych programistów SQL.

Jednym z rozwiązań jest wykluczenie wartości null, na przykład:

SELECT x FROM A WHERE x NOT IN (SELECT x FROM B where x is not null)

Aby uzyskać więcej informacji, zobacz artykuł Wikidii o logice trójwartościowej.

2
Andomar 16 luty 2012, 17:21