关于SQL查询的问题
我在做一个涉及oracle数据库的小项目, 我有以下表格:关于SQL查询的问题,sql,oracle,Sql,Oracle,我在做一个涉及oracle数据库的小项目, 我有以下表格: CUSTOMER ( Cid, CName, City, Discount ) PRODUCT ( Pid, PName, City, Quantity, Price ) ORDERS ( OrderNo, Month, Cid, Aid, Pid, OrderedQuantity, Cost ) 如何检索订购所有产品的所有客户的姓名 例如,如果客户x订购了产品1、产品2和产品3(这些都是公司提供的产品),他将被选中。如果客户y只订购
CUSTOMER ( Cid, CName, City, Discount )
PRODUCT ( Pid, PName, City, Quantity, Price )
ORDERS ( OrderNo, Month, Cid, Aid, Pid, OrderedQuantity, Cost )
如何检索订购所有产品的所有客户的姓名
例如,如果客户x订购了产品1、产品2和产品3(这些都是公司提供的产品),他将被选中。如果客户y只订购了产品1和2,而不是3,则不会选择他
我如何才能做到这一点?您想要“关系划分”
或
这里是Joe Celko的一篇优秀文章,展示了几种实现关系划分(和变体)的方法:您可以使用
分组方式
,并使用having
子句要求客户订购所有产品:
select c.CName
from Customers c
join Orders o
on o.Cid = c.Cid
group by
c.Cid
, c.CName
having count(distinct o.Pid) = (select count(*) from products)
与“关系除数”方法相比,我的可读性更强,但效率更低。您可以使用plsql还是仅使用SQL?+1。如果有人有兴趣了解更多关于关系部门的信息,Joe Celko在这里写了一篇非常好的文章:@Kaitsu,我找不到smarties的SQL,所以我在Google上搜索了Celko和关系部门。刚读完这篇文章,我就看到了你的评论;)
select c.cid
,c.name
from customer c
join orders o using(cid)
group
by c.id
,c.name
having count(distinct o.pid) = (select count(*) from product);
select c.CName
from Customers c
join Orders o
on o.Cid = c.Cid
group by
c.Cid
, c.CName
having count(distinct o.Pid) = (select count(*) from products)