it-swarm.com.de

Wie wählt man alle Datensätze aus einer Tabelle aus, die in einer anderen Tabelle nicht vorhanden sind?

table1 (id, name)
table2 (id, name)

Abfrage:

SELECT name   
FROM table2  
-- that are not in table1 already
401
z-boss
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

Q: Was passiert hier?

A: Konzeptionell wählen wir alle Zeilen aus table1 aus und versuchen für jede Zeile, eine Zeile in table2 zu finden. mit demselben Wert für die Spalte name. Wenn es keine solche Zeile gibt, lassen wir den Teil table2 unseres Ergebnisses für diese Zeile leer. Dann beschränken wir unsere Auswahl, indem wir nur die Zeilen im Ergebnis auswählen, in denen die übereinstimmende Zeile nicht vorhanden ist. Schließlich ignorieren wir alle Felder in unserem Ergebnis mit Ausnahme der Spalte name (die Spalte, von der wir sicher sind, dass sie existiert, von table1).

Obwohl dies möglicherweise nicht in allen Fällen die performanteste Methode ist, sollte sie grundsätzlich in jedem Datenbankmodul funktionieren, das versucht, ANSI 92 SQL zu implementieren

739
Kris

Sie können entweder tun

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

oder

SELECT name 
FROM table2 
WHERE NOT EXISTS 
    (SELECT * 
     FROM table1 
     WHERE table1.name = table2.name)

Siehe diese Frage für 3 Techniken, um dies zu erreichen

209
froadie

Ich habe nicht genug Wiederholungspunkte, um die 2. Antwort abzustimmen. Aber mit den Kommentaren zur Top-Antwort muss ich nicht einverstanden sein. Die zweite Antwort:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

Ist in der Praxis weitaus effizienter. Ich weiß nicht warum, aber ich arbeite mit mehr als 800.000 Datensätzen und der Unterschied ist enorm mit dem Vorteil, der der oben angegebenen zweiten Antwort zukommt. Nur meine 0,02 $

68
Tan Rezaei

Dies ist eine reine Mengenlehre, die Sie mit der Operation minus erreichen können.

select id, name from table1
minus
select id, name from table2
36
Winter
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b 
ON a.Key = b.Key 
WHERE b.Key IS NULL;

enter image description here

https://www.cloudways.com/blog/how-to-join-two-tables-mysql/

18
Anuraj

Achten Sie auf Fallstricke. Wenn das Feld Name in Table1 Nullen enthält, sind Sie überrascht. Besser ist:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT ISNULL(name ,'')
     FROM table1)
14
user4872693

Hier ist, was für mich am besten funktioniert hat.

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

Dies war mehr als doppelt so schnell wie jede andere Methode, die ich ausprobiert habe.

13
Bob

Sie können EXCEPT in mssql oder MINUS in Oracle verwenden. Sie sind identisch gemäß:

http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-Oracle/ =

8
Izzy

Das klappt bei mir prima

SELECT * 
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
7
David Fawzy

Ich werde (da ich noch nicht cool genug bin, um einen Kommentar abzugeben) in der richtigen Antwort posten ... für den Fall, dass jemand anderes der Meinung ist, dass es einer besseren Erklärung bedarf.

SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL

Und ich habe Syntax darin gesehen, dass FROM in mySQL Kommas zwischen Tabellennamen benötigt, aber in sqlLite schien es, den Raum zu bevorzugen.

Wenn Sie schlechte Variablennamen verwenden, bleiben unter dem Strich Fragen offen. Meine Variablen sollten sinnvoller sein. Und jemand sollte erklären, warum wir ein Komma oder kein Komma brauchen.

0
Adrian Roth

Siehe Abfrage:

SELECT * FROM Table1 WHERE
id NOT IN (SELECT 
        e.id
    FROM
        Table1 e
            INNER JOIN
        Table2 s ON e.id = s.id);

Konzeptionell wäre: Abrufen der übereinstimmenden Datensätze in der Unterabfrage und anschließendes Abrufen der Datensätze in der Hauptabfrage, die sich nicht in der Unterabfrage befinden.

0
jawahar