J'ai deux requêtes que je pensais signifier la même chose, mais je continue à get des résultats différents et j'espérais que quelqu'un pourrait expliquer comment ils sont différents:
1.
select * from table1 a left join table2 b on a.Id = b.Id and a.val = 0 where b.Id is null
2.
select * from table1 a left join table2 b on a.Id = b.Id where b.Id is null and a.val = 0
Le sharepoint la requête est de find les lignes qui sont dans table1 et val = 0 qui ne sont pas dans table2.
J'utilise aussi SQL Server 2008, mais je doute que cela soit important.
Quand on considère les jointures à gauche, on pense à trois étapes conceptuelles.
Vous verrez alors pourquoi vous obtenez des résultats différents.
Cela explique aussi pourquoi cela renvoie des résultats
select o.* from sys.objects o left join sys.objects o2 on o.object_id=o2.object_id and 1=0
Et ce n'est pas le cas.
select o.* from sys.objects o left join sys.objects o2 on o.object_id=o2.object_id where 1=0
SELECT * from TABLE1 t1 WHERE Val = 0 AND NOT EXISTS(SELEct 1 from Table2 t2 Where t1.Id = t2.Id)
Si vous supprimez entièrement la clause WHERE
, l'utilisation d'une LEFT OUTER JOIN
signifie que toutes les lignes de la table à gauche apparaîtront, même si elles ne satisfont pas aux critères JOIN
. Par exemple, aucune ligne ne satisfait l'expression 1 = 0
cependant ceci:
SELECT * FROM table1 AS a LEFT OUTER JOIN table2 AS b ON a.Id = b.Id AND 1 = 0;
entraîne toujours le return de toutes les lignes de la table1 où les valeurs de l' id
correspondent. Tout simplement, c'est ainsi que travaille OUTER JOIN
.
La clause WHERE
est appliquée après le JOIN
, donc cette
SELECT * FROM table1 AS a LEFT OUTER JOIN table2 AS b ON a.Id = b.Id WHERE 1 = 0;
ne returnnera aucune ligne.