Mam dwie tabele, jedna ma klucz podstawowy, druga ma go jako klucz obcy.
Chcę pobrać dane z tabeli podstawowej tylko wtedy, gdy tabela pomocnicza nie ma wpisu zawierającego jego klucz. Rodzaj przeciwieństwa prostego sprzężenia wewnętrznego, które zwraca tylko wiersze połączone tym kluczem.
B.Key IS NULL
ale nadal jesteśmy porównywalniA.Key = B.Key
?SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol)
Ogólnie ,
(NOT) EXISTS
jest to lepszy wybór następnie(NOT) IN
albo(LEFT) JOIN
źródło
LEFT JOIN
przewyższaNOT EXIST
użyj lewej złączenia „nie istnieje”:
SELECT p.* FROM primary_table p LEFT JOIN second s ON p.ID = s.ID WHERE s.ID IS NULL
źródło
Innym rozwiązaniem jest:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
źródło
SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL
źródło
P.key = S.key
a następnie mówimywhere S.key IS NULL
, czy to również nie powoduje, że P.key jest równy zeru?Jeśli chcesz wybrać kolumny z pierwszej tabeli, które są również obecne w drugiej tabeli, w tym przypadku możesz również użyć
EXCEPT
. W tym przypadku nazwy kolumn również mogą być różne, ale typ danych powinien być taki sam.Przykład:
select ID, FName from FirstTable EXCEPT select ID, SName from SecondTable
źródło
Było to pomocne w użyciu w języku COGNOS, ponieważ tworzenie instrukcji SQL „nie w” w Cognos było dozwolone, ale trwało to zbyt długo. Ręcznie zakodowałem tabelę A, aby dołączyć do tabeli B w Cognos jako A.key „not in” B.key, ale zapytanie trwało zbyt długo / nie zwracało wyników po 5 minutach.
Oto co zrobiłem dla każdego, kto szuka rozwiązania „NIE W” w Cognos. Utwórz zapytanie, które łączy tabele A i B z LEFT JOIN w Cognos, wybierając typ łącza: tabela A.Klucz ma wartości „0 do N” w tabeli B, a następnie dodaje Filtr (odpowiadają one klauzulom Where) dla: tabeli B .Key ma wartość NULL.
Biegał szybko i jak urok.
źródło