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 odpowiedzi
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
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.
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.