2016-11-30 20 views
0

私はこのクエリを入力し、SQLが返す結果が多すぎるのはなぜですか?

SELECT OrderDetails.OrderDetailID, Customers.CustomerName 
    FROM OrderDetails, Customers 
     NATURAL JOIN Products 
     NATURAL JOIN Customers 
WHERE SupplierID = 5; 

1001のレコードが返されます。

私はこのクエリを入力し

SELECT OrderDetailID 
    FROM OrderDetails 
     NATURAL JOIN Products 
WHERE SupplierID = 5; 

11のレコードが

を返された顧客テーブル内の91枚のレコードと11件の結果2番目のクエリで返されると、91 * 11がありますが予想されるよう= 1001。私はこれを取り除き、このような最初のクエリで返される重複した結果を防ぐ方法を知らない。

Duplicate Returns

スキーマの添付:http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

+2

私は離れて、自然から合流いたい、彼らはあなたに本当の利益とAのためのタイピングの少し量を節約します(例えば、後でプロジェクトが成長した後、 "標準化された"タイムスタンプがテーブルに追加され、以前に動作していたNATURAL JOINは同じタイムスタンプの結果のみを返します)。 – Uueerdo

+2

^^はい、推測せずに正確な回答を提供できるように、テーブル構造を投稿してください。しかし、この問題は、 'FROM OrderDetails、Customers'を使うことに起因しています。ここではカンマ構文のため暗黙的な内部結合を持つデカルト積を作成しました。 –

+0

あなたが含むリンクは実際にスキーマを表示しません。質問を編集して、ここに直接 'CREATE TABLE'文を追加してください。 –

答えて

0

あなたはOrderDetailsOrderDetailsので、あなたがそれを取得するために必要とされるcustomeridが含まれていないからCustomersに参加するOrdersテーブルを使用する必要がありますcustomersテーブル。

優れたクエリは次のようになります。これらは予測不可能にすることができ、SQLを書くとき、それは可能な限り明確にするために、常に良い考えですので、

SELECT orderDetails.OrderDetailID, customers.CustomerName 
    FROM OrderDetails orderDetails 
     INNER JOIN Orders orders on orderDetails.OrderID = orders.OrderID 
     INNER JOIN Customers customers on orders.customerID = customers.customerID 
     INNER JOIN Products products on prderDetails.ProductID = products.ProductID 
    WHERE products.SupplierID = 5; 

は、ここでは、 Natural Joinsを避けます。さらに、 Ordersテーブルを使用して customersへのリンクを取得します。

+0

"Natural Joins ...予測不可能なことがあります" - 予測できない状況が心配している場合は、防御的にコードすることができます(これは、 ?)例えば特権を持つビューを使用します。 – onedaywhen

0

別のNATURAL JOINと(CROSS JOINの省略形である)、カンマを交換します。また、あなたが範囲変数を使用する必要はありませんNATURAL JOINを使用している場合は、OrderDetails.OrderDetailID単にOrderDetailIDに変更、すなわち:

SELECT OrderDetailID, CustomerName 
    FROM OrderDetails 
     NATURAL JOIN Orders 
     NATURAL JOIN Customers 
     NATURAL JOIN Products 
WHERE SupplierID = 5; 
+0

製品への参加は必要ありません。 – onedaywhen

関連する問題