É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