Der größte Unterschied besteht nicht in der Verbindung vs nicht existiert, es ist (wie geschrieben), die SELECT *.
Im ersten Beispiel erhalten Sie alle Spalten von beiden A und Bim zweiten Beispiel nur Spalten von A.
In SQL Server ist die zweite Variante in einem sehr einfachen konstruierten Beispiel etwas schneller:
Erstellen Sie zwei Beispieltabellen:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
Fügen Sie 10.000 Zeilen in jede Tabelle ein:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Entfernen Sie jede fünfte Zeile aus der zweiten Tabelle:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
Führen Sie die beiden SELECTTestanweisungsvarianten durch:
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
Ausführungspläne:

Die zweite Variante muss die Filteroperation nicht ausführen, da sie den linken Antisemi- Join-Operator verwenden kann.
WHERE A.idx NOT IN (...)ist nicht identisch aufgrund des dreiwertigen VerhaltenNULL(dhNULLnicht gleich istNULL(noch ungleich), also , wenn Sie irgendwelcheNULLintableBunerwartete Ergebnisse erhalten!)