Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist der Unterschied zwischen diesen beiden Abfragen, da sie zwei unterschiedliche Resultsets erhalten?

Es macht wirklich keinen Unterschied, wenn Sie dies im INNER JOIN tun.

Wenn Sie jedoch LEFT oder RIGHT JOIN verwenden, ist dies tatsächlich einen Unterschied machen, ob Sie den zusätzlichen Filter in die JOIN- oder in die WHERE-Klausel einbauen.

Wenn Sie den Filter in die WHERE-Klausel einfügen, führt SQL Server zuerst die Verknüpfung durch und dann vollständig filtert die Zeilen heraus, auf die der Filter nicht passt.
--> Dadurch wird die Anzahl der zurückgegebenen Zeilen reduziert

Wenn Sie den Filter in den JOIN einfügen, filtert SQL Server während des Joins, aber nur in der Tabelle, in die Sie den Filter einfügen.
Sie erhalten immer noch alle Zeilen aus den anderen Tabellen, aber nur diese enthalten die Daten aus der gefilterten Tabelle, in die der Filter passt.
--> Dadurch wird die Anzahl der Zeilen nicht verringert, aber die Spalten mit Daten aus der Filtertabelle werden in mehr Zeilen leer sein

Es ist schwer zu erklären ... um es klarer zu machen, hier ist ein Beispiel:

Nehmen Sie die Beispieldaten von Antwort von RedFilter :

CREATE TABLE [dbo].[t1](
    [ID] [int] NULL,
    [StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
    [ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)

...und führen Sie die folgenden Abfragen darauf aus:

/* this returns four rows, but only two will have data 
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 

/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
WHERE t2.ID = 1 

/* this returns four rows as in the first query, but only one 
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
AND t2.ID = 1 

Beachten Sie die unterschiedlichen Ergebnisse, wie in den Kommentaren angegeben.