2013-05-09 64 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