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 A
aber ich weiß, dass sie table A
etwas 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.
select * from TableB b where b.ID not in (select a.ID from TableA a)
Select 1
bedeutet Rückgabe1
als 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önnen1
zu jedem gültigen Wert (*, 1,2,3, Spalte1, Spalte2) wechseln, und die Ergebnisse werden nicht geändert.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).
quelle
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 )
quelle
Das funktioniert auch
SELECT * FROM tableB WHERE ID NOT IN ( SELECT ID FROM tableA );
quelle
Oder wenn "NOT EXISTS" nicht implementiert sind
SELECT * FROM B WHERE (SELECT count(*) FROM A WHERE A.ID = B.ID) < 1
quelle