Conditions dans la clause On

J'utilise SQL Server 2008.

Quelle est la différence entre:

Avec des conditions dans la clause Where

 select customer.Id, order.Id from Customer customer left outer join Order order on order.customerId = customer.Id where order.deleted =0 

Avec conditions sur la clause ON

 select customer.Id, order.Id from Customer customer left outer join Order order on order.customerId = customer.Id and order.deleted =0 

Et comment les deux comparer avec

 select customer.Id, order.Id from Customer customer inner join Order order on order.customerId = customer.Id where order.deleted =0 

Je pense que vous devriez en apprendre davantage sur les sql joins . Voici un joli lien pour commencer.

Fondamentalement,

  • Cas 1 : Vous order.deleted =0 qui pourrait être null car c'est la right table of a left join . Si la table de droite n'a pas de ligne de mapping, les colonnes de cette table seront nulles. Il devrait être comme ISNULL(order.deleted,0)=0 ou order.delete IS NULL or order.delete=0

  • Cas 2 : ON est la condition où les deux tables se rejoignent et la condition order.deleted =0 est vérifiée (je pense) avant la jointure

  • Cas 3 : JOIN or INNER JOIN simple JOIN or INNER JOIN où les lignes exactes sont mappées des deux côtés

Placez-les tous dans une window de requête dans SSMS et tapez ctrl+l (ou activez l'option qui affiche le plan d'exécution réel après l'exécution de la requête) et consultez les plans générés par SQL. Cela vous dira comment c'est différent. SQL va prendre des décisions sur les requêtes pour le rendre optimal, ce qui peut varier en fonction de votre système (par exemple, les index, etc).

Faire un LEFT JOIN peut se refind avec un plan d'exécution différent à less que SQL puisse dire "hey, vous dites LEFT JOIN mais votre clause WHERE fait essentiellement fonctionner comme une INNER JOIN" et corrige / optimise les choses pour vous.

laissez-nous vous avez deux tables

Client

 ID 1 2 3 

Commande

 ID Customer ------------ 1 1 2 2 3 2 

Le client 3 n'a aucune command.

Et quand une jointure à gauche est faite de CUSTOMER à ORDER les colonnes dans la table ORDER seront null pour le client 3. Donc si la condition est sur l'instruction where, les clients sans command ne seront pas returnnés. Si la condition est activée, ces commands ne seront pas incluses.

Permettez-moi de répondre spécifiquement à votre question.

Les première et troisième requêtes sont identiques dans les résultats, sinon dans les plans d'exécution. La clause where search un champ dans la seconde table d'une left outer join . Toute ligne de la première table mais pas la seconde aura des valeurs NULL et sera filtrée.

La deuxième requête conservera toutes les lignes de la première table avec toutes leurs commands (le cas échéant).