2011-01-25 8 views
0

私は以下のレガシーPL/SQLに遭遇し、幾分混乱するスカラー・定数に対する外部ジョインを見つけました。まず、誰かがこれをANSIに変換しようとする試みが正しいことを確認してください。レガシー・アウター・ジョインからANSIへの変換

レガシーコード

cursor c1item (c1item_iel_id number) is 
select 
    `<columns>` 
from iel_item iit, iel_item_property iip 
    where iit.iit_change_type = 'I' 
    and iip.iip_change_type (+) = 'I' 
    and iip.it_id (+) = iit.it_id 
    and iit.iel_id = c1item_iel_id 
    and iip.iel_id (+) = c1item_iel_id; 

ANSIコード

cursor c1item (c1item_iel_id number) is 
select 
    `<columns>` 
from iel_item iit 
left outer join iel_item_property iip 
on iip.it_id = iit.it_id 
    and iit.iit_change_type = 'I' 
    and iip.iip_change_type = 'I' 
    and iit.iel_id = c1item_iel_id 
    and iip.iel_id = c1item_iel_id; 

これが正しい場合は、私は外部結合を使用してのポイントが表示されていません。確かに、主キーIIT IIPテーブルに対応する外部キーを持っていない次いでiip.iit_change_typeiip.iel_id両方は、それらが除外される場合には、NULLであろう表にをit_id場合AND節によって。ではなぜ内部結合を使用しないのですか?何か不足していますか?または元のコードナンセンスですか?

+0

レガシーをANSIに変更しているのですか、ANSIの扱いをちょうど取り戻していますか? –

+0

レガシーコードを理解しようとしています。 ANSIに変換すると助けになるようです。 – JohnA

+0

しかし、コードをANSIに変更するつもりはありませんか? –

答えて

6

はありません、それは正しくありません - でマークされたものだけを「(+)」WHERE句のためのものである、JOINをLEFTにあると休息が必要:外部結合を持つ

SELECT `<columns>` 
    FROM iel_item iit 
LEFT JOIN iel_item_property iip ON iip.it_id = iit.it_id 
           AND iip.iip_change_type = 'I' 
           AND iip.iel_id = c1item_iel_id 
    WHERE iit.iit_change_type = 'I'  
     AND iit.iel_id = c1item_iel_id 

配置に関する事項 - - ON句の条件はJOINの前に適用され、WHEREの条件はの後に適用され、のJOINの後に適用されます。これは、返される結果セットに大きな影響を与える可能性があり、データと設定によって異なります。配置はINNER JOINSには関係ありません。WHERE句またはON句では、結果セットは同じになります。

+0

だから、私は何かが欠けていた。ありがとうございます – JohnA

+1

@cyberwiki:私はあなたが私の答えをdownvotingして、競合する回答をupvotingしていることをよく知っています。その答えが100%正しいこと、または競合する回答の前に問題ではありません。あなたはあなたが受け取ったどんな下降声についても私に責任を負わせることができます、あなたがゴミをたくさん話しますが、私はそれらを投げることを意味しません。あなた自身を乗り越え、すでに成長しています。 –

+0

それは問題ですか?各DVDはあなたのスコアの0.003%です。 –

3

いいえ正しくありません。

cursor c1item (c1item_iel_id number) is 
select 
    `<columns>` 
from iel_item iit 
left outer join iel_item_property iip 
on iip.it_id = iit.it_id 
    and iip.iip_change_type = 'I' 
    and iip.iel_id = c1item_iel_id 
where and iit.iel_id = c1item_iel_id 
    and iit.iit_change_type = 'I' ; 
0

それはまた次のように書き換え中することができます:

SELECT columns1 
FROM iel_item iit 
     RIGHT OUTER JOIN iel_item_property iip 
     ON iip.iip_change_type = 'I' 
      AND iip.it_id = iit.it_id 
      AND iip.iel_id = c1item_iel_id 
WHERE iit.iit_change_type = 'I' 
     AND iit.iel_id = c1item_iel_id 

次回は元のクエリに結合述部のみ3外側があった、あなたの新しいものはすべて5

があるべき持っていますOracle独自のジョインをANSI SQL準拠のジョインに書き直す必要がある場合は、エラーの発生を最小限に抑えて自動的に行うことができます。here is a tool

関連する問題