Chciałem uruchomić proste zapytanie, aby wyrzucić wszystkie wiersze, w Table1
których wartość kolumny głównej nie występuje w kolumnie w innej tabeli ( Table2
).
Próbowałem użyć:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Zamiast tego generuje błąd składniowy. Wyszukiwarka Google zaprowadziła mnie na fora, na których ludzie mówili, że MySQL nie obsługuje NOT IN
i należy zastosować coś niezwykle złożonego. Czy to prawda? Czy popełniam straszny błąd?
Odpowiedzi:
Aby użyć IN, musisz mieć zestaw, zamiast tego użyj tej składni:
źródło
table2.principal
możnaNULL
. W takim przypadkuNOT IN
zawsze będzie zwracany,FALSE
ponieważNOT IN
jest traktowany jako<> ALL
, który porównuje wszystkie wiersze z podzapytania jakTable1.principal <> table2.principal
, co kończy się niepowodzeniem w porównaniu zNULL
:Table1.principal <> NULL
nie spowodujeTRUE
. Aby rozwiązać:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.Odpowiedź na pytanie dotyczące podpowiedzi została już udzielona, ale należy pamiętać, że w wielu przypadkach
LEFT JOIN
można to zrobić szybciej:Jeśli chcesz sprawdzić wiele tabel, aby upewnić się, że nie ma ich w żadnej z tabel (jak w komentarzu SRKR), możesz użyć tego:
źródło
NOT IN
&LEFT JOIN
. +1 zarównoNOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL w MySQL
[…]
[…]
[…]
(podkreślenia dodane)
źródło
Niestety wydaje się, że jest to problem ze stosowaniem przez MySql klauzuli „NOT IN”, zrzut ekranu poniżej pokazuje opcję zapytania podrzędnego zwracającą błędne wyniki:
źródło
Uważaj
NOT IN
nie jest pseudonimem<> ANY
, ale dla<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
nie mogę zostać zastąpiony przez
Musisz użyć
źródło