2013-05-09 66 views
0

我有以下关系和找到每一个项目,最昂贵的一些条件

1.I要找到每一个供应商提供的零部件的PID,并在低于200 (如有供应商要么不不能简单地超过200,是不是选择了部分的部分或收费)

小提琴http://sqlfiddle.com/#!2/4b5d4

Supplies    
sid  1 2 3 4 5 
sname Jason David John Peter Jay 
address 221 2b 3c 4d 5e 


Parts      
pid  10 20 30 40 50 60 
pname Head Body Hand Leg Arm Foot 
color red blue green white red green 


Catalog    
sid  1 1 2 2 3 4 1 1 4 4 1 5 5 3 3 2 
pid  10 20 20 30 30 40 30 40 10 50 50 50 10 60 10 10 
cost 150 220 150 150 130 125 130 280 123 126 120 100 100 210 100 50 

所以我下面的查询 我认为,这等于说there is no parts that the suppliers don't supply it.

SELECT C.pid 
FROM CATALOG C 
WHERE C.cost < 200 
    AND NOT EXISTS (SELECT S.sid 
        FROM Suppliers S 
        WHERE NOT EXISTS 
        (SELECT P.pid 
        FROM Parts P 
        WHERE P.pid = C.pid 
        AND S.sid = C.sid)) 

但它返回null,则应该返回10

我想去寻找每一个提供绿色部分和红色部分供应商,打印最贵的名称和价格她供应的部分。

我只能找出绿色和红色部分,但找不到最贵的。

查询是我试过了。

SELECT S.sname 
FROM Suppliers AS S, 
    Parts AS P1, 
    CATALOG AS C1, 
    Parts AS P2 , 
    CATALOG AS C2 
WHERE S.sid = C1.sid 
    AND C1.pid = P1.pid 
    AND S.sid = C2.sid 
    AND C2.pid = P2.pid 
    AND (P1.color = 'red' 
     AND P2.color = 'green') 

我该如何解决?预先感谢。

ps对不起,我必须去上课,我会回复约6小时后。

+0

能否请您解释,为什么'10'应该在结果列表中的第1部分? – 2013-05-09 05:50:00

+0

因为pid为10的部分出现在每个供应商中,并且都小于200. – 2013-05-09 05:55:33

回答

1

PART1

选择PID从目录,其中成本< 200组由pid具有计数(SID)> =(SELECT COUNT(SID)从供应商)

Sql Fiddle Demo

Part2-:

Select t.sname,Max(Catalog.cost) from (SELECT S.sname,c2.cost,c2.sid 
FROM Suppliers AS S, Parts AS P1, Catalog AS C1, Parts AS P2 , Catalog AS C2 
WHERE S.sid = C1.sid 
AND C1.pid = P1.pid 
AND S.sid = C2.sid 
AND C2.pid = P2.pid 
AND (
P1.color = 'red' 
AND P2.color = 'green' 
)) t inner join Catalog on t.sid =Catalog.sid 
group by t.sid 

Sql Fiddle Demo

1

对于第1部分,我觉得这个查询更具可读性,并返回您预期的结果:

SELECT a.pid 
FROM 
(
    SELECT pid, MAX(cost) max_price, COUNT(1) amount 
    FROM Catalog 
    GROUP BY pid 
) a 
WHERE 
    a.amount = (SELECT COUNT(1) FROM Suppliers) 
    AND max_price < 200 

现在相反,你写的东西,在这里你需要的EXISTS检查具有或者红色的供应商或绿色部分:

SELECT 
    sid 
FROM 
    Suppliers 
WHERE 
    EXISTS 
    (
     SELECT 1 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Parts.color = 'green' 
    ) 
    AND EXISTS 
    (
     SELECT 1 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Parts.color = 'red' 
    ) 

最后,完整的结果应该是这样的:

SELECT 
    sid, 
    (
     SELECT pname 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Catalog.cost = (SELECT MAX(c.cost) FROM Catalog c WHERE c.sid = Suppliers.sid) 
     LIMIT 1 
    ) name, 
    (
     SELECT cost 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Catalog.cost = (SELECT MAX(c.cost) FROM Catalog c WHERE c.sid = Suppliers.sid) 
     LIMIT 1 
    ) cost 
FROM 
    Suppliers 
WHERE 
    EXISTS 
    (
     SELECT 1 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Parts.color = 'green' 
    ) 
    AND EXISTS 
    (
     SELECT 1 
     FROM 
      Catalog 
      LEFT JOIN Parts ON Catalog.pid = Parts.pid 
     WHERE 
      Catalog.sid = Suppliers.sid 
      AND Parts.color = 'red' 
    ) 

SQL fiddle here

+0

那么你知道我的方法在第1部分中出了什么问题吗? – 2013-05-09 06:03:16

+0

不,我不遵循你的查询逻辑,恐怕:) – 2013-05-09 06:26:48

1

对于第2部分可以尝试

Select S.Sname,P.pname,c.cost from Suppliers As S, Parts AS P, Catalog AS C 
    where S.sid=C.Sid And P.pid  =C.pid  
    And color in ('green','red') 
     And c.cost in 
      (Select max(cost) from Catalog AS C1,Parts AS P1 where c1.pid=P1.pid and P1.color=P.color) 
+0

('green','red')中的颜色与('green',''')中的(伪代码)红'') – 2013-05-09 06:20:22

+0

从供应商选择S.Sname,P.pname,c.cost作为S,零件AS P,目录AS C \t \t其中S.sid = C.Sid和P.pid = C.pid \t \t和In( '绿色', '红色') \t \t \t而c.cost在颜色 \t \t \t \t(从目录选择最大值(成本)AS C1,零件AS P1其中c1.pid = P1.pid和('绿色','红色'))中的P1.color – 2013-05-09 06:29:44