SQLに関しまして質問させて頂きます。
更新元テーブルA、マスタテーブルB、更新先テーブルCがあり、
以下のような条件を一つのSQL文で実現したいと思っています。
【条件】
(1)Aのe列が1のものを対象に更新をかける
(2)条件(1)を満たすレコードの各所属&氏名をマスタBのIDに置き換え、テーブルCに更新
【テーブルA(更新元)】
-----------------------------------------------
No 所属1 氏名1 所属2 氏名2 所属3 氏名3 e
01 A01 ああ A01 いい C01 おお 1
02 A01 いい A01 うう C01 おお 0
03 B01 ああ B01 ええ C01 おお 1
-----------------------------------------------
【テーブルB(マスタ)】
-----------------
ID 所属 氏名
001 A01 ああ
002 A01 いい
003 B01 ああ
:
-----------------
【テーブルC(更新先)】
------------------
No ID1 ID2 ID3
01 001 002 025
02 002 003 025
03 011 014 025
------------------
テーブルAが1レコードであれば
update C set
ID1=(select ID from A, B where A.所属1=B.所属 AND A.氏名1=B.氏名)
ID2=(select ID from A, B where A.所属2=B.所属 AND A.氏名2=B.氏名)
ID3=(select ID from A, B where A.所属3=B.所属 AND A.氏名3=B.氏名)
where No='01'
で行くのですが、10000行の更新で10000回update文を発行すると処理に時間がかかります。
そこで、updateの一括実行を行いたいと考えています。
ご存知の方がいらしましたら、
ご教授よろしくお願い致しますm(_ _)m
【環境】
oracle 9i
No.3ベストアンサー
- 回答日時:
何を悩んでいるのか理解するのに時間がかかりました..(^^
あなたが書かれたUPDATE文で使っているサブクエリは、
更新対象のCとAやBの条件を書いていないので、
予め対象を限定しないと誤動作するのです。
原則として、UPDATEで使うサブクエリは、相関サブクエリに
なるように、更新対象テーブルとの関係をサブクエリの条件に
加える必要があると認識してください。
例えば、こんな感じ。
update C set
ID1=(select ID from A, B where C.No=A.No AND A.e=1 AND A.所属1=B.所属 AND A.氏名1=B.氏名),
ID2=(select ID from A, B where C.No=A.No AND A.e=1 AND A.所属2=B.所属 AND A.氏名2=B.氏名),
ID3=(select ID from A, B where C.No=A.No AND A.e=1 AND A.所属3=B.所属 AND A.氏名3=B.氏名),
where exists(select 1 from A where A.e=1 and A.No=C.No)
;
回答ありがとうございます。この方法で100件の更新が成功したので10000件の更新ができるよう頑張ります。
初め上記方法に似たSQLでやっていたのですが、サブクエリの方で複数行返ってきてしまい実行できませんでした。その理由が「原則として・・・」ですべてが理解できました。
この度は本当にありがとうございます。今後ともよろしくお願いします。
No.2
- 回答日時:
>所属と氏名が入っていない場合(所属B,氏名Bがなしの場合。
どちらかが無いのは無い)もあるのですが、selectでマスタ値のみとってくるとそのあたりはどうなりますか?nullでしょうか?それともその列が返ってこない?#1で書いたSQLでは返ってきません。
理由は、Aテーブルと各Bテーブルの結合が内部結合だからです。
外部結合にすれば、IDはnullで返されます。
この回答への補足
上記どおり、外部結合にして試してみましたが、30分ほど待ってみても結果が返ってきませんでした。。。
件数が多すぎるのが問題でしょうか。。。
No.1
- 回答日時:
update C set(ID1, ID2, ID3) =
(
select B1.ID, B2.ID, B3.ID form A, B B1, B B2, B B3
where A.所属1=B1.所属 AND A.氏名1=B1.氏名
and A.所属2=B2.所属 AND A.氏名2=B2.氏名
and A.所属3=B3.所属 AND A.氏名3=B3.氏名
and A.e = 1
and A.No = C.No)
こんな感じかな?
setの書き方はOracleの方言ですので他のDBでは使えません。
#テーブルAがIDじゃなく所属と名前を持っている構成がよくわかりませんが・・・
この回答への補足
早速のご回答ありがとうございます。
所属と氏名が入っていない場合(所属B,氏名Bがなしの場合。どちらかが無いのは無い)もあるのですが、selectでマスタ値のみとってくるとそのあたりはどうなりますか?nullでしょうか?それともその列が返ってこない?
情報が不十分ですみません。
#テーブルAがIDじゃなく所属と名前を持っている構成がよくわかりませんが・・・
ファイルをそのままワーク表として読み込んだので、こうなりました。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
SQLの書き方(チェックボックス)
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
unionの結果は集計はできないで...
-
oracleの分割delete
-
複数テーブルのMAX値の行データ...
-
MERGE文を単体テーブルに対して...
-
マテビューのNOTNULL設定について
-
updateの一括実行
-
PL/SQL
-
unionでマージした副問合せを結合
-
SELECTの結果で同一行を複数回...
-
COUNTの取得方法(?)について...
-
SELECTで1件のみ取得するには?
-
Excelで、改行がある場合の条件...
-
Oracleでの文字列連結サイズの上限
-
SQL文で右から1文字だけ削除す...
-
Accessで別テーブルの値をフォ...
-
ADO VBA 実行時エラー3021
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
固定値を含む結合と複数テーブ...
-
MERGE文を単体テーブルに対して...
-
unionの結果は集計はできないで...
-
oracleの分割delete
-
SET句内で複数の条件を指定して...
-
複数テーブルのMAX値の行データ...
-
SQL GROUPで件数の一番多いレコ...
-
他のテーブルを参照した値はupd...
-
外部結合とor条件混在の記述方法
-
unionでマージした副問合せを結合
-
COUNTの取得方法(?)について...
-
集計後の数値が倍になる
-
SQLの書き方(チェックボックス)
-
副問い合わせのinsert文
-
OracleのSQLについて質問があり...
-
updateの一括実行
おすすめ情報