0

私は次の関係を持っており、

1.すべてのサプライヤから供給された部品の pid が 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 を返す必要があります。

2.緑の部品と赤の部品を供給するすべてのサプライヤーを見つけて、そのサプライヤーが供給する最も高価な部品の名前と価格を出力したいと考えています。

私は緑と赤の部分を見つけることができますが、最も高価なものを見つけることができません.

クエリは、私が試したことです。

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 時間後に返信します。

4

3 に答える 3

1

パート1

カタログから pid を選択します。ここで、count(Sid) を持つ pid によるコスト <200 グループ >=(サプライヤーからカウント (sid) を選択)

SQL フィドルのデモ

パート2-:

  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 フィドルのデモ

于 2013-05-09T06:21:54.800 に答える
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)
于 2013-05-09T06:18:40.263 に答える
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 フィドル

于 2013-05-09T06:01:31.487 に答える