設計値テーブル 単価テーブル ID Parm Value ID Cost -- ---- ----- -- ---- 01 長さ 30 01 null 01 高さ 25 02 null 02 長さ 50 03 null 02 高さ 30 03 長さ 50 03 高さ 30 設計値テーブルを元に単価テーブルを更新する、 単価 = 設計値(IDで紐づけ)の長さ×高さ とする。 更新結果 単価テーブル ID Cost -- ---- 01 750 02 1500 03 1500
create table 単価( ID char(2), Cost number); create table 設計値( ID char(2), Parm char(4), Value number); insert into 単価(ID) values('01'); insert into 単価(ID) values('02'); insert into 単価(ID) values('03'); insert into 設計値(ID,Parm,Value) values('01','長さ',30); insert into 設計値(ID,Parm,Value) values('01','高さ',25); insert into 設計値(ID,Parm,Value) values('02','長さ',50); insert into 設計値(ID,Parm,Value) values('02','高さ',30); insert into 設計値(ID,Parm,Value) values('03','長さ',50); insert into 設計値(ID,Parm,Value) values('03','高さ',30); commit;
--■■■この形式のupdate文だと文法エラー■■■ --update 単価 a set Cost = (select b.Value from 設計値 b -- where b.ID=a.ID -- and b.Parm='長さ') * -- (select b.Value from 設計値 b -- where b.ID=a.ID -- and b.Parm='高さ'); --■■■この形式のupdate文だとうまくいきます■■■ update 単価 a set (Cost) = (select (select b.Value from 設計値 b where b.ID=a.ID and b.Parm='長さ') * (select b.Value from 設計値 b where b.ID=a.ID and b.Parm='高さ') from dual); --■■■これでもOK■■■ update 単価 a set Cost = (select b.Value * c.Value from 設計値 b,設計値 c where b.ID=a.ID and c.ID=a.ID and b.Parm='長さ' and c.Parm='高さ'); --■■■結合してpivotを使う方法■■■ update 単価 a set Cost = (select max(decode(b.Parm,'長さ',b.Value)) * max(decode(b.Parm,'高さ',b.Value)) from 設計値 b where b.ID = a.ID);
一つ目のUpdate文は文法エラーでしたが、他はうまくいきました 一つ目のUpdate文の文法エラーは、パーサの仕様でしょうか?