2016-10-24 4 views
0

これは「pe.partyid」(レベル2)にオラクルサブクエリが第2レベルで変数を参照しない

「無効な識別子」を返します。

修正方法を教えてください。

update table_x pe 
    set pe.taxidnumber = 
     (select tin 
      from (select tin 
         ,version 
         ,max(version) over(partition by partyid) maxversion 
        from table_y 
       where partyid = pe.partyid) 
     where version = maxversion); 

答えて

1

は、Oracleでは、あなたはではなく、より深くネストされたサブクエリでは、即時のサブクエリ(1レベル下)で表の別名を使用することができます。

ファクタド・サブクエリ(WITH句)でこれを回避できます。しかし、あなたの場合、相関サブサブクエリがなぜ必要なのかは明らかではありません。 partyidで一致するWHERE条件を中間クエリに移動します。そのようにして、最も内側のクエリは無相関となりますので、1回だけ計算されます。 partyidのチェックをversion = maxversionの横に移動します。

0

私はどうなる:

create global temporary table tempt as select tin, partyid from table_y where rownum < 2; 
    insert into tempt select tin, partyid 
      from (select tin 
         ,partyid 
         ,version 
         ,max(version) over(partition by partyid) maxversion 
        from table_y 
     where version = maxversion); 
    merge into table_x t 
    using tempt d 
    on (t.partyid = d.partyid) 
    when matched then update set t.tin = d.tin; 
+0

を一時テーブルは全く必要ありません。 'select'ステートメントは' merge'ステートメントで直接使用できます。 –

+0

@a_horse_with_no_nameコメントをいただきありがとうございますが、私は知っていますが、もっと多くの列を更新する場合は、ORA-30926との混乱を避けるために、一時表を使用したソリューションを掲載しました。 – Kacper

関連する問題