SQL: Überprüfen Sie, ob der Eintrag in Tabelle A in Tabelle B vorhanden ist

79

Ich habe eine Definitionstabelle, von der ich weiß, dass sie nicht sehr gut gepflegt wird. Nennen wir dies table A. Ich habe eine andere Tabelle (nenne sie table B), die viel kleiner ist und idealerweise eine sein sollte, subset of table Aaber ich weiß, dass sie table Aetwas veraltet ist und keine neuen Einträge enthält, die sich in befinden Table B.

Beachten Sie, dass die Tabellen A und B unterschiedliche Spalten haben.

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

Ich möchte alle Zeilen in Tabelle B so, dass die ID in Tabelle B NICHT in Tabelle A vorhanden ist. Dies stimmt nicht nur mit den Zeilen in Tabelle A überein. Ich möchte nur Zeilen in Tabelle B, in denen die ID in Tabelle A überhaupt nicht vorhanden ist.

Codierknopf
quelle

Antworten:

169
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)
Gdoron unterstützt Monica
quelle
@ algotr8der, ich war froh zu helfen. Schönen Tag.
Gdoron unterstützt Monica
10
select * from TableB b where b.ID not in (select a.ID from TableA a)
Vakio
2
@vakio Danke für die Anfrage. Sie sollten auf jeden Fall Ihren Kommentar als Antwort setzen.
Analytical Monk
@AnalyticalMonk Ich hoffe, Sie wissen, dass es genau dieselbe Abfrage ist, die genau dieselben Ergebnisse liefert. Nur eine etwas andere Syntax, das ist alles
Gdoron unterstützt Monica
2
@ManosKounelakis Select 1bedeutet Rückgabe 1als Ergebnis für jede Zeile. Es wird oft verwendet, um zu notieren, dass die Ergebnisse keine Rolle spielen, aber die Existenz allein ist diejenige, die zählt. Sie können 1zu jedem gültigen Wert (*, 1,2,3, Spalte1, Spalte2) wechseln, und die Ergebnisse werden nicht geändert.
Gdoron unterstützt Monica
28

Die klassische Antwort, die in fast jeder Umgebung funktioniert, lautet

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

Manchmal ist NOT EXISTS möglicherweise nicht implementiert (funktioniert nicht).

Danylo Zherebetskyy
quelle
Danke, das hat sehr geholfen!
Lenach87
Diese Abfrage ist effizienter als SELECT * FROM B, WO NICHT EXISTIERT (SELECT 1 FROM A WHERE A.ID = B.ID)
teteArg
Das DUAL ist eine spezielle Tabelle mit einer Zeile und einer Spalte, die standardmäßig in allen Oracle-Datenbanken vorhanden ist. Der Eigentümer von DUAL ist SYS (SYS besitzt das Datenwörterbuch, daher ist DUAL Teil des Datenwörterbuchs.) Auf DUAL kann jedoch jeder Benutzer zugreifen. Die Tabelle enthält eine einzelne VARCHAR2 (1) -Spalte namens DUMMY mit dem Wert 'X'. Mit MySQL kann DUAL als Tabelle in Abfragen angegeben werden, die keine Daten aus Tabellen benötigen. In SQL Server ist die DUAL-Tabelle nicht vorhanden, Sie können jedoch eine erstellen.
David Kariuki
14

Wenn Sie EXISTS verwenden möchten, können Sie in SQL Server Folgendes verwenden:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)
Abe Miessler
quelle
1

Das funktioniert auch

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);
Kai Dong
quelle
0

Oder wenn "NOT EXISTS" nicht implementiert sind

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
Daflanck
quelle