2016-04-04 15 views
1

タスク:カテゴリは‘Sea Food’に属するすべての受注を選択します。予期しない場合、クエリはデカルト積を返します

結果:あるOrderNo、受注日、製品名

私はこのクエリを書きますが、それはデカルト積を返します。

select o.orderid, o.orderdate as "Order Date", p.productname , ct.categoryname from orders o, 
order_details od , products p , customers c ,categories ct 
where 
od.orderid = o.orderid and p.productid = od.productid and ct.categoryid = p.categoryid 
and ct.categoryname = 'Seafood'; 

質問:私のクエリの何が問題になっているのですか?

+2

1つ目は、コンマが「FROM」節で過度に使用されているアーカイブ構文を使用していることです。適切な明示的な 'JOIN'構文の使用方法を学んでください。 –

+0

'where'の代わりに' join'を使ってテーブルを結合してください。 2人のための内部作業は非常に異なっています。 where句を使用して表に結合すると、Oracleはすべての表のデカルト積を最初に実行し、Where句を適用するため、デカルト積が得られます。 – Munir

+1

whereテーブルでcustomerテーブルが使用されていませんか? – cableload

答えて

1

customersテーブルでCROSS JOINを実行していると、接続を指定していないためです。このため、WHERE句にカンマを使用する古い構文ではなく、明示的なJOIN構文を使用する必要があります。

明示的な構文にクエリを翻訳した後、あなたはcustomersテーブルを含むいかなるWHERE条件が存在しないことがわかります。

select 
o.orderid, 
o.orderdate as "Order Date", 
p.productname, 
ct.categoryname 
from 
orders o, 
inner join order_details od on od.orderid = o.orderid 
inner join products p on p.productid = od.productid 
inner join categories ct on ct.categoryid = p.categoryid 
cross join customers c -- either you don't need this table, or you need to specify conditions 
where 
ct.categoryname = 'Seafood' 

は基本的にあなたが得た理由は、それはあなたのwhere句がcustomersテーブルを含む結合条件を省略していることでした、

+0

はい、クエリから顧客テーブルを削除した後、正しい結果を返します –

関連する問題