みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

テーブルの更新を教えて下さい

テーブルの更新を教えて下さい
素人勉強中です。
下記条件でUPDATEを行いたいのですが、ご教授願います。
【環境】
 Oracle 10g

テーブル:拝送M
品番、種類、発注先、納入日
AAA X1 T001 2010/01/01
AAA X1 T001
AAA X1 T001
AAA X1 T002

テーブル:実績M
品番、種類、発注先、実績日
AAA X1 T001 2010/03/01
AAA X1 T001 2010/03/02
AAA X1 T002 2010/03/03
AAA X1 T002 2010/03/04

更新条件は以下になります。
 ・「拝送M」の「納入日」がNULLのものを更新したい(上書きはしない)
 ・2つのテーブルの結合キーは「品番」+「種類」+「発注先」(キーは張っていない)
 ・「拝送M」「実績M」とも重複あり
 ・「実績M」の「品番」+「種類」+「発注先」で集計し、「実績日」の一番小さい日を使って
  「拝送M」の「納入日」をUPDATEする

【拝送M更新後】
品番、種類、発注先、納入日
AAA X1 T001 2010/01/01
AAA X1 T001 2010/03/01 ←UPDATE:実績Mの同一キーで「実績日」が一番小さい日付
AAA X1 T001 2010/03/01 ←UPDATE:実績Mの同一キーで「実績日」が一番小さい日付
AAA X1 T002 2010/03/03 ←UPDATE:実績Mの同一キーで「実績日」が一番小さい日付

SELECTで更新したい日付を抽出することは出来たのですが、この条件で得た日付をUPDATEするのに悩んでいます。
例えば、
SELECT J1.品番, J1.種類, J1.発注先, MIN(J1.実績日) FROM 拝送M T1, 実績M J1 WHERE CONCAT(CONCAT(RPAD(T1.品番,12), RPAD(T1.種類,3)), RPAD(T1.発注先,6)) = CONCAT(CONCAT(RPAD(J1.品番,12), RPAD(J1.種類,3)), RPAD(J1.発注先,6)) AND (((T1.納入日) IS NULL)) GROUP BY J1.品番, J1.種類, J1.発注先 ;

UPDATE文でなくても、FETCHとかでも良いと思っているのですが、素人の私にはまだまだ一人で解決できずに試行錯誤ばかりで進めません。
どなたか宜しくお願い致します。

投稿日時 - 2010-04-02 19:41:12

QNo.5797945

困ってます

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

update 拝送M h set h.納入日 =
(
select min(z.実績日) from 実績M z
where z.品番 = h.品番
and z.種類 = h.種類
and z.発注先 = h.発注先
group by z.品番, z.種類, z.発注先
)
where h.納入日 is null

投稿日時 - 2010-04-03 00:22:29

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

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

回答(2)

副問合せを使えば出来ると思いますが。

以下のページの「クエリーの結果によるUPDATE」の辺りを読んでみましょう。

[参考]Oracle SQL (データの更新 :UPDATE文の基礎)
http://www.mitene.or.jp/~rnk/TIPS_ORCL_UPDATE.htm

投稿日時 - 2010-04-02 21:51:08

あなたにオススメの質問