2017-11-06 8 views
0

ここコンバートSQLは、92私はANSI 92にANSI 89からSQL文を変換しようとしています

がある( "(+)" の中に "OUTHER登録しよう" transofrmすることを意味します)コード:

select a.*, p.price 
from article a, prices p 
where a.product_id = p.product_id(+) 
and trunc(sysdate) + 1 between a.date_from and date_to 
and trunc(sysdate) + 1 between p.date_from(+) and p.date_to(+); 

私は(+)、左または右に参照していることを知って、JOIN、それが置かれpossitionに依存しますが、私は最後の行を変換するためにどのようにそれを得ることができない( and trunc(sysdate) + 1 between p.date_from(+) and p.date_to(+)

今まで、私はフォローをしましたing:

select a.*, p.price 
from article a 
left join prices p 
on a.product_id = p.product_id 
where trunc(sysdate) + 1 between a.date_from and date_to 

しかし、最後の条件をどのように変換するかわかりません。

誰か助けてもらえますか?私は各テーブルにはdate_fromdate_toを、持っていることを仮定していると、あなたは両方の範囲と比較することを意味していること

+0

'left join'を使うと、'(+) 'はもう必要ありません。さまざまなansi92のジョインについて[興味深い古い投稿](https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join?rq=1)あなたは読むことができます。また、 'left join 'の' on'の 'between 'の基準を使用することは可能です(そうはほとんどありませんが)。 – LukStorms

+0

'とtrunc(sysdate)+ 1をp.date_fromとp.date_to; '? –

+0

@LukStorms:私の間違い、私は試しに「(+)」を忘れてしまった。とにかく、記事は良いですが、すでにLEFT/RIGHT/INNER/FULL結合の違いを知っています。私はANSI 92 – mikcutu

答えて

0

は、ありがとうございます。その場合、サンプルクエリに a.が残っているので、追加しました。もちろん、だから、明らかに難易度はあなたが、 where句に

and trunc(sysdate) + 1 between p.date_from and p.date_to 

を追加するならば、任意のレコード「NULL Sを生成した」ということです

...それはあなたが何を意味するのかでない場合に調整して自由に感じますその状態で誤って扱われることになります。だからではなく、外部ジョイン条件

select a.*, p.price 
    from   article a 
     left join prices p 
    on a.product_id = p.product_id 
    and trunc(sysdate) + 1 between p.date_from and p.date_to 
where trunc(sysdate) + 1 between a.date_from and a.date_to 

p間違いなく上の日付範囲のチェックが本当に結合条件ではありませんので、意味的に、これは、ハッキングのビットであるに追加することができます。これは条件に「外側」セマンティクスを適用します。他の、より明示的なオプションが

select a.*, p.price 
    from   article a 
     left join prices p 
    on a.product_id = p.product_id 
where trunc(sysdate) + 1 between a.date_from and a.date_to 
    and (trunc(sysdate) + 1 between p.date_from and p.date_to 
     or p.product_id is null) 

だろう(あなたはorをドロップすることができ、ちょうどbetween coalesce(p.date_from, trunc(sysdate)) and coalesce(p.date_to, trunc(sysdate)+2))またはそのような何かを言うが、これは唯一のgenerated- NULLレコードはそれらの値のためにNULLを有することを前提としていかもしれない - すなわちpricesレコードは実際にはそれらの列にNULLを持っています)。

関連する問題