こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

UPDATEで困っています

下記の2つの表があり、
表Aから伝票番号毎に集計したTAXで、
同じ伝票番号をもつ表BのTAXを、一括更新しようと考えています。
表Bについては、伝票番号の中で最小の明細番号の行のみ
更新しなければなりません。

SQL-SERVERでは、下記のSQLでどうやら大丈夫そうなのですが、
Oracleでは、更新どころかエラーが発生してしまい、
途方に暮れています。
どなたか、ご教授頂けないでしょうか?
よろしくお願い致します。

update B
set 税額 = AA.税額合計
from B
inner join
(select 伝票番号, min(明細番号) as 最小明細番号
  from B group by 伝票番号) as BB
on BB.伝票番号 = B.伝票番号 and BB.最小明細番号 = B.明細番号
inner join
(select 伝票番号, sum(税額) as 税額合計
from A group by 伝票番号) as AA
on AA.伝票番号 = B.伝票番号

(表A)
・伝票番号
・明細番号
・TAX

(表B)
・伝票番号
・明細番号
・金額
・TAX

投稿日時 - 2006-10-26 21:26:45

QNo.2499400

困ってます

質問者が選んだベストアンサー

A,B間の明細番号が一致しないのであれば、次のSQLでいけると思いますよ。

update B
set TAX=(select sum(TAX) from A where A.伝票番号=B.伝票番号)
where (伝票番号,明細番号) in (select 伝票番号,min(明細番号) from B)
;

変更点が少ないのでお間違いなく。

投稿日時 - 2006-10-26 23:52:24

お礼

うまく更新できました。
ありがとうございます!

投稿日時 - 2006-11-01 23:58:13

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

説明の通りやれば良いのであれば・・

update B
set TAX=(select sum(TAX) from A where A.伝票番号=B.伝票番号)
where (伝票番号,明細番号) in (select 伝票番号,min(明細番号) from A)
;

な感じ。

投稿日時 - 2006-10-26 22:25:44

補足

ご回答ありがとうございます。
せっかく、ご教授頂きました内容ですが、
select 伝票番号,min(明細番号) from A)では、
表Aの一番小さい明細番号と同一の明細番号をもつ、
表Bを更新する内容だと思います。

この表AとBとは、同一の伝票番号でリンクしていますが、
明細番号は同一ではありません。
1つの伝票番号にN件の明細があり、
その種別(商品金額、税額)により、各々別表に格納されています。
ですので、この条件では、期待通りの更新はされないのでは?
と思いますが、如何でしょうか?

説明不足で申し訳ありません。

投稿日時 - 2006-10-26 23:17:34

あなたにオススメの質問