Jak wykluczyć wiersze, które nie są połączone z inną tabelą?


86

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.

Odpowiedzi:


269

tekst alternatywny

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Pełny obraz dołączenia tekst alternatywny

Z aticle: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
Wreszcie! dlaczego nie mają tego w podręcznikach i dlaczego moi wykładowcy na uniwersytecie ich nie mają ?! używali najgorszych możliwych wyjaśnień na świecie, wcale nie zbliżonych do nich!
pythonian29033

4
To jest złoto. Nienawidzę pisać komentarza, który nie ma treści, ale wylewne pochwały, ale daj spokój! To niesamowita odpowiedź. Dziękuję, @Pranay Rana.
0xbe5077 z

1
Proszę wyjaśnij mi, dlaczego, B.Key IS NULLale nadal jesteśmy porównywalni A.Key = B.Key?
Do Nhu Vy

1
@DoNhuVy proste, porównanie znajduje się w klauzuli „ON”, w złączeniu LEFT lub RIGHT, jeśli nie ma pasującego wiersza, łączy się wiersz ze wszystkimi wartościami NULL, po czym testuje się wartość IS NULL, aby wiedzieć, że nie ma pasującego wiersza . (
Nawiasem

Używam poniższego zapytania: SELECT A. * FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId JEST NULL LUB B.JobFileId A.AccountID JEST NULL LUB B.AccountID JEST NULL Zasadniczo mam dwie porównujące dwie wartości w klauzuli „ON”. Działa poprawnie, ale kwerenda zwraca pusty wiersz dla tych wierszy, które nie są dopasowane. Jak to rozwiązać? Proszę o pomoc
HarshSharma

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

Ogólnie , (NOT) EXISTSjest to lepszy wybór następnie (NOT) INalbo(LEFT) JOIN


cóż, nie opublikował, jakie DBRMS są używane, jednak w MySql LEFT JOINprzewyższaNOT EXIST
The Scrum Meister

@ The Scrum Meister: czy powiedziałem szybciej? Wyszukaj IN vs EXISTS vs JOIN, aby odkryć semantyczne i logiczne różnice ...
gbn

@gbn Przepraszam, pomyślałem, że przez „lepszy wybór” masz na myśli szybciej. Czy możesz zatem wyjaśnić, w jaki sposób jest to lepszy wybór? wyjaśnienie.com/2009
09/18/...

1
@The Scrum Meister: ogólnie rzecz biorąc, każdy rodzaj DOŁĄCZENIA może wymagać WYRÓŻNIENIA. NOT IN z wartością null na liście daje fałsz. IN / EXISTS zachowują się tak samo. Jednak jedyną „bezpieczną” konstrukcją jest (NIE) ISTNIEJE, chyba że lubisz niespójność
gbn

@The Scrum Meister: objaśnienia.com /2009
06/16/in

4

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

4

Innym rozwiązaniem jest:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)

3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
Mam pytanie ... jeśli używamy warunku, P.key = S.keya następnie mówimy where S.key IS NULL, czy to również nie powoduje, że P.key jest równy zeru?
Somjit

2

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

0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.