关于SQL查询的问题

关于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只订购

我在做一个涉及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只订购了产品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)