现有两张表,一张订单表(Orders)和一张产品表(Product),需要编写一个查询语句,查找出购买了所有产品的客户编号(CustomerId)。
订单表中包含的信息如下:
其中,Id表示订单编号,CustomerId表示客户编号,ProductId表示产品编号,Order表示订单量,OrderDate表示下订单的日期。
产品表中包含的信息如下图:
其中,Id表示产品编号,Name表示产品名称。
方法一:连接查询
第一步,对订单表中的每一个CustomerId统计不重复ProductId的个数,得到每个客户所购买的产品种类数量。
select CustomerId,count(distinct ProductId)as ProC1
from Orders
group by CustomerId;
第二步,计算产品表中所有的产品种类数量。
select count(Id)as ProC2
from product;
第三步,连接第一步和第二步生成的临时表,比较两个表的产品种类数量,产品种类数量相同的就是购买了所有产品的客户。
select CustomerId
from
(
select distinct CustomerId,count(distinct ProductId)as ProC1
from Orders
group by CustomerId
)o
inner join
(
select count(Id)as ProC2
from product
)p
on o.ProC1=p.ProC2;
方法二:在having子句中使用子查询。
与方法一的第一步、第二步一样,也是先分别计算出订单表中每个客户购买的产品种类数量和产品表中所有的产品种类数量,只是最后一步对比两个数量时,用having实现,具体代码如下:
select CustomerId
from Orders
group by CustomerId
having
count(distinct ProductId)
=
(select count(Id)as ProC2
from product);
喜欢
分享
or