Requête SQL avec sous-requête et sans comparaison de sous-requêtes

J'aimerais quelqu'un qui peut m'expliquer la différence de logique entre ces deux requêtes. Peut-être que vous pouvez aussi expliquer la différence de performance. (DB est Microsoft Northwind).

– Rejoindre

select distinct c.CustomerID, c.CompanyName, c.ContactName from orders as o inner join customers as c on o.CustomerID = c.CustomerID 

– Sous-requête

 select customerid, companyname, contactname, country from customers where customerid in (select distinct customerid from orders) 

Merci d'avance.

Le premier génère un set de résultats intermédiaire avec toutes les commands pour tous les clients. Il les réduit ensuite en utilisant select distinct .

La seconde sélectionne simplement les clients sans avoir à les réduire plus tard. Cela devrait être beaucoup plus efficace. Cependant, select distinct n'est pas nécessaire dans la sous-requête (il est fait automatiquement avec in ).

J'écrirais la logique comme:

 select c.customerid, c.companyname, c.contactname, c.country from customers c where exists (select 1 from orders o where o.customerid = c.customerid ); 

Cela peut facilement faire usage d'un index sur les orders(customerid) .