Différence sémantique entre les requêtes jointes

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.

    1. Le filter de jointure est appliqué
    2. Les lignes de gauche sont ajoutées dans
    3. la clause where est appliquée.

    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.