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.

Antworten:


169
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)

@ 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).


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
)

1

Das funktioniert auch

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);

0

Oder wenn "NOT EXISTS" nicht implementiert sind

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.