3

(+) を使用して 2 つのテーブルを結合する Oracle 結合構文を理解しようとしています。標準の結合構文を使用するように変換された場合、このクエリがどのようになるかを誰か教えてもらえますか?

select p1.product_id, p1.product_name, p2.product_code, (decode(p3.product_type, null, 'N/A',p3.product_type) as product_type
from products p1, product_descriptions p2, product_descriptions p3
where p1.product_id=p2.product_id
and p2.product_age=p3.product_age(+)
and p2.product_type=p3.product_type(+)
and p3.status(+)='VALID'
4

1 に答える 1

5

このようなもの:

select p1.product_id, p1.product_name, p2.product_code,
    (decode(p3.product_type, null, 'N/A', p3.product_type) as product_type
from products p1
join product_descriptions p2
    on p1.product_id = p2.product_id
left join product_descriptions p3
    on p3.product_age = p2.product_age
    and p3.product_type = p2.product_type
    and p3.status = 'VALID';

は、とwhere p1.product_id=p2.product_idの間の通常の内部結合です。その他は外部結合です。書き方は左右の外部結合が混在しているように見えますが、実際にはそうではありません。これは、 /結合との積の間のかなり単純な左外部結合です。p1p2and p2.product_age=p3.product_age(+)and p3.product_age(+)=p2.product_agep1p2p3

余談ですが、私は のようなエイリアスのファンではp1ありp2ませp3ん。それらは説明的ではなく、より複雑なクエリでこれを行うと簡単に迷子になるからです。私は一人じゃない

外部結合が必要かどうかはわかりませんが、むしろデータに依存します。product_ageproduct_typeが一意の場合はcasep2.status; product_ageそうでない場合は、 /product_type行は1 つしか指定できないと想定している可能性がありVALIDます。そうしないと、重複が発生します。自分が何をしようとしているのかをただ考えているだけです...

于 2013-01-30T17:35:06.193 に答える