2011-09-13 8 views
0

私は3つの異なるテーブルを組み合わせようとしているプロジェクトに取り組んでいます。 表1と2は同じIDを持つ行を持っています。この場合はproduct_idです。表2と3についても同じことが続きます。クエリを送信するときに日付を使用しています。与えられたフレームの中に収まる結果しか得られないはずです。私のコードは次のとおりです:日付と参加に関する質問

select order.orderDate, orderLine.order_id, product.product_id, product.name 
from order, product 
inner join orderLine 
on product.product_id = orderLine.product_id 
where order.orderDate between '2009-09-01' and '2009-09-30' ; 

これを使用すると、注文表に含まれる日付が1つしかありません。私はまた、与えられた日付に合わない行から情報を得る。

これは紛らわしいことですが、大変申し訳ありません。私の英語はあまり良くないので、理解できないように苦労しています。また、詳しい情報が必要な場合はお知らせください。このサイトとSQLの両方に新しい。

+0

'日付' 2009-09-01 'と' 2009-09-30 'の間にはしてはいけませんか? –

+0

@Joelいいえ、そうすべきではありません。 –

+0

@Adrian、PL/SQLに慣れるとどうなるでしょう。 –

答えて

6

すべての3つのテーブル参加してみてください。私は欠けているが、(@あたりp.campbellの回答など)句に参加考える一方で

select o.orderDate, ol.order_id, p.product_id, p.name 
from order as o 
inner join orderLine as ol 
    on ol.order_id = o.order_id 
inner join product as p on o 
    on p.product_id = ol.product_id 
where o.orderDate between '2009-09-01' and '2009-09-30' ; 
+0

それはちょうどそれかもしれない。残念ながら、私は私のユニでのアクセス権しか持っていないので、今はテストできません。しかし、午前中にまずそれを試してみましょう!迅速な返信をありがとう! – Cor

+1

あなたの問題は、implicとexplictの構文を混在させ、暗黙的な構文はクロスジョインです。 implict構文を使用する必要はありません。それを非常に悪いSQl反パターンとして再度コードを書かないでください。このような誤ったクロスジョインは、20年前のより優れたテクニックで置き換えられたこれらのジョインを使用することが非常に貧弱なプログラミングテクニックである理由の一部です。 – HLGEM

+0

それは働いた!本当にありがとう! – Cor

0

は、あなたの「あまりにも多くの行を返さ」解決する問題をするかどうかと、私は思ったんだけどあなたの日付表現には、さらに「行が返らない」という問題があります。

where order.orderDate between '2009-09-01' and '2009-09-30' 

意図は、2009年9月の受注を返すために、おそらくですが、orderDate = '2009-09-01 12:00:00' 1を省略します。

あなたのコードは、文章でピリオドのクローズドクローズド表現と呼ばれるものを使用していることを示しています。ピリオドには終了日が含まれています。ただし、推奨は、終了日がその期間に含まれていないクローズド・オープン表現(ハーフ・オープン・インターバルとも呼ばれます)を使用することです。

従って、クローズドオープン表現を使用して、同じ述語(すなわち、すべて2009年9月のオーダー)は次のようになります。詳細については

where order.orderDate >= '2009-09-01' 
     and order.orderDate < '2009-10-01' 

Snodgrass, Richard T. (1999). Developing Time-Oriented Database Applications in SQLを参照して、第4章期間。