Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quelle est la différence entre ces deux requêtes pour obtenir deux ensembles de résultats différents ?

Cela ne fait vraiment aucune différence lorsque vous faites cela dans INNER JOIN.

Cependant, lorsque vous utilisez LEFT ou RIGHT JOIN, cela fait faire une différence si vous mettez le filtre supplémentaire dans la clause JOIN ou dans la clause WHERE.

Lorsque vous placez le filtre dans la clause WHERE, SQL Server effectue d'abord la jointure, puis complètement filtre les lignes où le filtre ne rentre pas.
--> cela réduira le nombre de lignes renvoyées

Lorsque vous mettez le filtre dans le JOIN, SQL Server effectue le filtrage pendant la jointure, mais uniquement sur la table où vous placez le filtre.
Vous obtenez toujours toutes les lignes des autres tables, mais seules celles-ci contiennent les données de la table filtrée où le filtre s'adapte.
--> cela ne réduira pas le nombre de lignes, mais les colonnes avec des données de la table filteres seront vides dans plus de lignes

C'est difficile à expliquer... pour que ce soit plus clair, voici un exemple :

Prenez les exemples de données de Réponse de 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)

...et exécutez les requêtes suivantes :

/* 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 

Notez les différents résultats comme indiqué dans les commentaires.