2

次のようなリレーショナル データベース スキーマがあります。 ここに画像の説明を入力

問題は、「2009 年に製品を購入し、その製品が 1968 年にハネウェルによって製造された顧客の詳細を見つけること」です。

私がこれまでに行ったことは次のとおりです。

SELECT * FROM Customer
WHERE CID IN
    (SELECT Customer_ID FROM Order
     WHERE Purchase_Date = 2009 
     AND EXISTS
        (SELECT * FROM Order_Items, Product, Manufacturer
         WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
         Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));

私はデータベースを勉強して約 1 か月しか経っていないので、ここの専門家にはとても複雑に見えると思います.. これは正しくできましたか? それ以外の場合は、どこを修正すべきかフィードバックをお寄せください..

前もって感謝します。

4

1 に答える 1

2

通常、リレーショナル データベースの関連テーブルから情報を取得する場合JOIN、クエリから取得する必要がある結果に適した結合タイプを使用してテーブルを検索する必要があります。外部テーブルの一致しない行を含めるかどうか。したがって、あなたの場合、これを行うことができます:

SELECT DISTINCT c.*
FROM Customer c
INNER JOIN Order        o ON c.CID             = o.Customer_ID
INNER JOIN OrderItems  oi ON o.OID             = oi.OID
INNER JOIN Product      p ON oi.ProductID      = p.PID
INNER JOIN Manufacturer m ON p.Manufacturer_ID = m.MID
WHERE o.Purchase_Date = 2009 
  AND m.Mnufacturer_Name = "Honeywell"
  AND m.Manufacturerd_Date = 1968

ただし、投稿したクエリでは:

SELECT * FROM Customer
WHERE CID IN
    (SELECT Customer_ID FROM Order
     WHERE Purchase_Date = 2009 
     AND EXISTS
        (SELECT * FROM Order_Items, Product, Manufacturer
         WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
         Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));

IN述語を使用し、3 つのテーブルOrder_Itemsを結合し、古い結合構文を使用していますProductManufacturer.. FROM Order_Items, Product, Manufacturer WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID

クエリが機能する可能性があります。ただし、にNULL値がある場合Customer_ID、結果は返されません。しかし、その代わりに使いやすくなりますJOIN。についての便利ないいねは次のJOINとおりです。

于 2012-11-01T08:46:25.777 に答える