Antworten:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
F : Was passiert hier?
A : Konzeptionell wählen wir alle Zeilen aus table1
und versuchen für jede Zeile eine Zeile table2
mit demselben Wert für die name
Spalte zu finden. Wenn es keine solche Zeile gibt, lassen wir einfach den table2
Teil 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 aus unserem Ergebnis mit Ausnahme der name
Spalte (von der wir sicher sind, dass sie existiert table1
).
Obwohl dies möglicherweise nicht in allen Fällen die leistungsfähigste Methode ist, sollte es in praktisch jeder Datenbank-Engine funktionieren, die jemals versucht, ANSI 92 SQL zu implementieren
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)
In dieser Frage finden Sie drei Techniken, um dies zu erreichen
Ich habe nicht genug Wiederholungspunkte, um die zweite Antwort abzustimmen. Aber ich muss den Kommentaren zur Top-Antwort nicht zustimmen. 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, den die zweite Antwort oben hat. Nur meine $ 0,02
Dies ist eine reine Mengenlehre, die Sie mit der minus
Operation erreichen können.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Achten Sie auf Fallstricke. Wenn das Feld Name
in Table1
Nullen enthält, werden Sie überrascht sein. Besser ist:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Folgendes hat für mich am besten funktioniert.
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.
Sie können EXCEPT
in mssql oder MINUS
in oracle verwenden, sie sind identisch nach:
Das funktioniert scharf für mich
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
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, die sich nicht in der Unterabfrage befinden.
Ich werde die richtige Antwort erneut posten (da ich noch nicht cool genug bin, um sie zu kommentieren) ... falls 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 gesehen, dass Syntax in FROM Kommas zwischen Tabellennamen in mySQL benötigt, aber in sqlLite schien es den Platz zu bevorzugen.
Wenn Sie falsche Variablennamen verwenden, bleiben unter dem Strich Fragen zurück. Meine Variablen sollten sinnvoller sein. Und jemand sollte erklären, warum wir ein Komma oder kein Komma brauchen.
Wenn Sie einen bestimmten Benutzer auswählen möchten
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
Das tent_npk
ist ein Primärschlüssel eines Benutzers