Comment sélectionner des lignes où plusieurs valeurs de tables jointes répondent aux critères de sélection?

Étant donné l'exemple de schéma de table suivant

Table des clients

CustID 1 2 3 

Table de facturation

 CustID InvoiceID 1 10 1 20 1 30 2 10 2 20 3 10 3 30 

L'objective est de sélectionner tous les clients ayant une valeur InvoiceID de 10 et 20 (non OR). Ainsi, dans cet exemple, les clients w / CustID = 1 et 2 seront returnnés.

Comment construiriez-vous l'instruction SELECT?

Utilisation:

  SELECT c.custid FROM CUSTOMER c JOIN INVOICE i ON i.custid = c.custid WHERE i.invoiceid IN (10, 20) GROUP BY c.custid HAVING COUNT(DISTINCT i.invoiceid) = 2 

L'élément key est que le comptage de i.invoiceid doit être égal au nombre d'arguments dans la clause IN .

L'utilisation de COUNT(DISTINCT i.invoiceid) est dans le cas où il n'y a pas une contrainte unique sur la combinaison de custid et invoiceid – s'il n'y a pas de risque de duplicates, vous pouvez omettre le DISTINCT de la requête:

  SELECT c.custid FROM CUSTOMER c JOIN INVOICE i ON i.custid = c.custid WHERE i.invoiceid IN (10, 20) GROUP BY c.custid HAVING COUNT(i.invoiceid) = 2 

Les réponses Group By fonctionneront à less qu'il ne soit possible d'avoir des multiples de CustID / InvoiceId dans la table Invoice. Ensuite, vous pourriez get des résultats inattendus. J'aime la réponse ci-dessous un peu mieux car elle reflète plus fidèlement la logique telle que vous la décrivez.

 Select CustID From Customer Where Exists (Select 1 from Invoice Where CustID=Customer.CustID and InvoiceID=10) and Exists (Select 1 from Invoice Where CustID=Customer.CustID and InvoiceID=20) 
 select CustID from InvoiceTable where InvoiceID in (10,20) group by CustID having COUNT(distinct InvoiceID) = 2