
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ランキング
-
バッチファイルで複数フォルダ...
-
Oracle で文字列からタイムスリ...
-
Object Browser相関タブの見方...
-
SQLについての質問
-
SQLについて教えて下さい。 主...
-
SQLで今日の日付でWhereしたい
-
秋葉原でWindowsを買ったのです...
-
オラクル12C_SQLPlusで実行す...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
-
sqlで質問です。 Aテーブルの情...
-
SQLの書き方について
-
sqlで質問です。 idを元にidに...
-
oracleで 10,20, 30, というデ...
-
索引作成について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
副問合せにLIKE文を使う方法は...
-
データベースのカラムの型がCHA...
-
バッチファイルで複数フォルダ...
-
batファイルでのSQL(oracle)...
-
64bit端末でのOLEDB接続に関して
-
10営業日前の日付を取得したい...
-
osqleditについて
-
update文で質問です。 下記の条...
-
orace SQL文のエラー(ORA-0092...
-
テーブルやカラムの物理名のネ...
-
オラクル12C_SQLPlusで実行す...
-
videopad 無料版 アンインストール
-
SQLの中上級者へのレベルアップ...
-
続.ORACLEのSELECTのソートに...
-
ワークテーブルって何?
-
oracleの直接接続のクライアン...
-
ORA-14452について
-
SQL ブレーク処理について
-
Oracleですがsqlで質問です。 ...
-
oracleで 10,20, 30, というデ...
おすすめ情報