2011-06-28 15 views
0

更新されたテーブルを参照する2レベルのサブクエリでUPDATE文を実行しようとしていますが、エラーが発生しています。 次のコードを考慮してください。それは、テーブルc(更新されたテーブル)が最も深いサブクエリ内で見えないかのように私に "c.end_date invalid identifier"エラーを与えています。 サブクエリを1つのレベルのサブクエリだけにフラット化すると、その背後にあるロジックが失われます。Oracle SQL - 複数レベルの相関サブクエリが機能しない

これを書く方法に関するアイデアは、コンパイルして正しく動作するでしょうか?

私は、Oracle Database 10g Enterprise Editionのリリース10.2.0.3.0を使用している - のProd

create table calc(
    agrmt_id number, 
    cust_num number, 
    prod_id number, 
    price number, 
    start_date date, 
    end_date date); 


create table trans(
    agrmt_id number, 
    cust_num number, 
    prod_id number, 
    units number, 
    trans_date date); 

create table products(
    prod_id number, 
    other_prc number, 
    prod_start date, 
    prod_end date); 

update calc c set price = (with avg_price_per_prod as (select prod_id, avg(other_prc) avg_prc 
       from products 
       where prod_end >= c.start_date 
       and prod_start <= c.end_date 
       group by prod_id 
      ) select sum(t.units) * a.avg_prc   
      from trans t, avg_price_per_prod a 
      where t.trans_date between c.start_date and c.end_date 
       and t.agrmt_id=c.agrmt_id 
       and t.cust_num=c.cust_num 

       and t.prod_id = a.prod_id 
      ); 

答えて

0

をあなたが(因数分解またはその他の)サブサブクエリ内で更新テーブルcを参照することはできません。あなたはそれを排除しなければならないでしょう。このようなもの(未テスト):

update calc c set price = (
    select sum(t.units) * avg(other_prc) 
    from trans t, products p 
    where t.trans_date between c.start_date and c.end_date 
     and t.trans_date between p.prod_start and p.prod_end 
     and t.prod_id = p.prod_id 
     and t.agrmt_id=c.agrmt_id 
     and t.cust_num=c.cust_num 
) 
関連する問題