2014-02-17 60 views
-5

对于这些关系:SQL查询以检索数据

Customer(CID, Name, City, State), 
Order(OID, CID, Date), and 
Product(PID, ProductName, Price) 
LineItem(LID, OID,PID, Number, TotalPrice), 

其中CID是客户ID,是客户的关键,OID是定购ID和对秩序的关键,并盖线项目id并且是LineItem的关键字。另外,Order的属性CID是一个引用Customer的CID的外键,也就是说,对于Order的每个CID c,只有一个Customer的CID属性为c的元组。 LineItem的OID是引用Order的OID的外键。同一订单有多个订单项,订单项是指产品并包含为产品订购的数量。

什么是查询: 名单由“mycity”

@Edit 这所有的客户买的产品是我到目前为止已经试过:

Select ProductName 
from Product 
where PID in (
    select PID 
    from LineItem 
    where OID in(
     Select OID 
     from Order 
     where CID in(
      select CID from customer where city='mycity' 
     ) 
    ) 
); 

这个查询然而,将返回所有客户从mycity购买的所有产品。而这个问题只需要那些'mycity'所有人都购买的产品。

不知道如何实现“所有”条件

@ EDIT2:终于解决了吧:)有人请核实?

+3

显示哪些查询您已经尝试到目前为止 – Sparky

+0

hrdasadia - 你永远也学不会如何做到这一点你自己,如果有人只是给你答案。做一个尝试并发布它。当你参加考试时你会感谢我。 :-) –

+1

这里没有奴隶为你做这项工作。尝试自己解决问题,并最终将它与您的代码一起发布。 – Mike

回答

0

更好的版本在一个单一的查询:

select p1.productname from Product p1, myorder s1, lineitem l1, customer c1 
where l1.pid=p1.pid 
and l1.OID=s1.oid 
and c1.cid=s1.cid 
and c1.city='mycity' 
group by p1.ProductName 
having count(distinct c1.cid)=(select count(1) from customer c2 where c2.city='mycity'); 
0
SELECT ProductName FROM Product 
INNER JOIN LineItem ON LineItem.PID=Product.PID 
INNER JOIN `Order` ON Order.OID=LineItem.OID 
INNER JOIN Customer ON Order.CID=Customer.CID 
WHERE Customer.City='mycity' 

我认为这应该工作

+0

这不起作用,因为它将返回'mycity'客户购买的所有产品,即使产品是由一个购买的。我想要'mycity'的所有顾客都购买的产品。所以,说'mycity'的每个人都会购买一台笔记本电脑,那么这就是我的查询必须返回的唯一产品。 – simpleJack

0

此查询两个部分解决:创建一个视图和查询查看

Create view hview as (SELECT distinct count(distinct Customer.CID) as 
uniquecustomer, count(distinct Customer.name), product.pid, product.Productname 
FROM myorder 
INNER JOIN Customer ON myorder.CID = Customer.CID 
INNER JOIN LineItem ON myorder.OID = LineItem.oid 
INNER JOIN Product ON Product.PID = LineItem.PID 
where Customer.city = 'mycity' 
group by Product.PID); 


select productname from product where pid in(
select PID from hview where uniquecustomer in(SELECT count(distinct Customer.CID) 
FROM myorder 
INNER JOIN Customer ON myorder.CID = Customer.CID 
INNER JOIN LineItem ON myorder.OID = LineItem.oid 
INNER JOIN Product ON Product.PID = LineItem.PID 
where Customer.city = 'mycity')); 

逻辑用于:建立与不同业主的项目的视图我的城市。 查询该视图以查找具有不同所有者的项目,该项目与mycity中不同客户的数量相同。每个拥有不同数量业主的项目都等于mycity不同客户的数量,这些产品都是由mycity中的每个人购买的。

* myorder是我用来替代顺序的表名,因为这是一个保留字。