给定以下示例表架构
客户表
CustID 1 2 3
发票表
CustID InvoiceID 1 10 1 20 1 30 2 10 2 20 3 10 3 30
目的是选择InvoiceID值为10和20(非OR)的所有客户。因此,在此示例中,将返回带有CustID = 1和2的客户。
您将如何构造SELECT语句?
使用:
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
关键是i.invoiceid需要计数等于IN子句中参数的数量。
i.invoiceid
IN
的使用COUNT(DISTINCT i.invoiceid)是在对帐务编号和发票编号的组合没有唯一约束的情况下- 如果没有重复的机会,则可以从查询中省略DISTINCT:
COUNT(DISTINCT i.invoiceid)
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