ここから本文です

ORACLE UPDATE文の書き方(N:1)について教えてください

あ~さん

2014/2/1921:47:26

ORACLE UPDATE文の書き方(N:1)について教えてください

A_TBL : B_TBL は N : 1 の関係です。
A_TBL.ITEM1, ITEM2(複数レコード)にB_TBLのITEM1, ITEM2(単一レコード)を設定したいです。
どのようなUPDATE文になるのでしょうか?
実行環境がないので、困っています。

↓↓↓ここまではわかりましたが、違うような気がする。。。↓↓↓
UPDATE A_TBL A
SET (A.ITEM1
, A.ITEM2
) = (
SELECT
B.ITEM1
, B.ITEM2
FROM B_TBL B
WHERE A.KEY = B.KEY
AND ROWNUM = 1
)

よろしくお願いします。

補足ROWNUM = 1
は2行抽出されるため行っているつもりです(2行とも同じ値であるため、ROWNUMとしています)
どうしてもA.KEY = B.KEYは2回発行しなければならないのでしょうか?
スマートでないきがするのですが・・・

閲覧数:
508
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nora1962jpさん

編集あり2014/2/2105:09:19

> AND ROWNUM = 1
この条件がなぜ必要なのかよくわかりません。
> WHERE A.KEY = B.KEY
だけでは複数行が返ってしまうのでしょうか。でもそうすると返される行の順序は保証されませんからそれはそれで問題な気がします。
単一行を返すなら。
UPDATE A_TBL A
SET (A.ITEM1
, A.ITEM2
) = (
SELECT
B.ITEM1
, B.ITEM2
FROM B_TBL B
WHERE A.KEY = B.KEY
)
WHERE EXISTS
( SELECT 1
FROM B_TBL B
WHERE A.KEY = B.KEY
)
ではないでしょうか。

【補足】
> WHERE A.KEY = B.KEY
A.KEYについてB.KEYが一意に定まるならROWNUM=1不要です。
後段のWHERE EXSISTSですが、これはA.KEY<>B.KEYの場合A.TBLの項目をNULLに更新してしまうのを防ぐたあああめです。もともとがNULLでも同じ値で更新してしまうのは非効率です。
SQL ServerやPostgresqlでは
UPDATE FROM構文を使えます。
MySQLではJOINのインラインビューを更新できます。
Oracleは推奨はされていないようですが、BYPASS_UJVCヒントが使えるかもしれません。
http://www.res-system.com/weblog/item/222

質問した人からのコメント

2014/2/21 09:29:30

なるほど!
やはりExists条件は必要なのですね。丁寧にありがとうございます。
BYPASS_UJVCヒントは今日の夜にでも見てみます。

ベストアンサー以外の回答

1〜1件/1件中

2014/2/2100:35:29

> A_TBL : B_TBL は N : 1 の関係です。
> A_TBL.ITEM1, ITEM2(複数レコード)にB_TBLのITEM1, ITEM2(単一レコード)を設定したいです。
文字通り同じKEY値に対し、A_TBLはN件でB_TBLが1件、ということであれば、ROWNUM=1 がなくてもサブクエリは複数行戻さないので問題ないのでは?

逆ということであれば、ご提示の方法でもできますし、select 句に DISTINCT を入れる、でもよいかと思います。
※ ROWNUM=1 の条件を入れる方法だと、万が一ITEM1とITEM2の組み合わせが複数登録されるバグが発生している場合でもエラーが起きないので気づけない、という欠点がありますが。

UPDATE A_TBL A
SET (A.ITEM1
, A.ITEM2
) = (
SELECT DISTINCT
B.ITEM1
, B.ITEM2
FROM B_TBL B
WHERE A.KEY = B.KEY
)

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる