1

次のステートメントは正しく機能しますが、各レコードを4回表示します。繰り返される; 私は関係が間違っていることを知っていますが、それを修正する方法がわかりませんか?これが単純で、私がそれを逃した場合は、お詫び申し上げます。

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name, Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers, Plants, Orders, Staff
INNER JOIN Orders AS t2 ON t2.Order_ID = Staff.Order_ID
WHERE Orders.Order_Date
BETWEEN  '2011/01/01'
AND  '2013/03/01'
4

3 に答える 3

6

テーブル間に結合構文を指定していないため、テーブル間にデカルト積を生成しています。

SELECT c.First_Name, c.Last_Name, 
    p.Common_Name, p.Flower_Colour, p.Flowering_Season, 
    s.First_Name, s.Last_Name
FROM Customers c
INNER JOIN Orders o
    on c.customerId = o.customer_id 
INNER JOIN  Plants p
    on o.plant_id = p.plant_id
INNER JOIN Staff s
    ON o.Order_ID = s.Order_ID
WHERE o.Order_Date BETWEEN  '2011/01/01' AND  '2013/03/01'

注:結合の列名を推測しています

これは、正しい構文を学習するのに役立つ結合の視覚的な説明です。

于 2013-01-07T20:08:04.590 に答える
2

Ordersこれは、4 つのテーブルを結合せずに選択し、 2 回結合しているためです。その結果、デカルト積が作成されます。

これを修正する方法は次のとおりです。ANSI 構文を使用して theta 結合を書き直し、適切な結合条件を指定します。

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name, Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers
JOIN Plants ON ...
JOIN Orders ON ...
JOIN Staff ON ...
INNER JOIN Orders AS t2 ON t2.Order_ID = Staff.Order_ID
WHERE Orders.Order_Date BETWEEN  '2011/01/01' AND  '2013/03/01'

...適切な結合条件に置き換えます。これにより、結果が期待どおりに見えるはずです。

于 2013-01-07T20:09:52.040 に答える
2

句ではFROM...、クロス結合を行っています-すべての顧客とすべての工場、すべての注文とすべてのスタッフを組み合わせます。

FROM句で1 つのテーブルのみを指定し、他のテーブルを接続して、INNER JOINS関連するレコードのみを取得する必要があります。

データベースがどのように見えるか正確にはわかりませんが、次のようになります。

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name,
Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers
INNER JOIN Orders ON Orders.Customer_ID = Customers.Customer_ID
INNER JOIN Staff ON Staff.Staff_ID = Orders.Staff_ID
INNER JOIN Plants ON Plants.Plants_ID = Orders.Plants_ID
WHERE Orders.Order_Date
BETWEEN  '2011/01/01'
AND  '2013/03/01'
于 2013-01-07T20:07:08.670 に答える