効率的な方法でSQL、ストアドでのUPDATEを実行する方法を教えてください

このQ&Aのポイント
  • テーブルAとテーブルBのデータ更新を効率的に行う方法についてアドバイスをお願いします。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索し、テーブルAのコードに書き込みたいと思っています。処理件数は約500件です。
  • SQLまたはストアドプロシージャを使用して、テーブルAとテーブルBのデータ更新を効率的に行う方法についてアドバイスをお願いします。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索し、テーブルAのコードに書き込みたいと考えています。処理件数はおよそ500件です。
  • テーブルAとテーブルBのデータ更新を効率的に行う方法について教えてください。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索してテーブルAのコードに書き込みたいと考えています。処理件数は約500件です。SQLまたはストアドプロシージャを使用した処理方法を教えてください。
回答を見る
  • ベストアンサー

SQL、ストアドでのUPDATEのアドバイスを下さい。

テーブルA、テーブルBがあってデータ更新の効率的な方法を探しています。 フィールドはそれぞれ、コード、名前、誕生日 があって、 データ、 ----------------------------- A  コードなし 名前 誕生日 B コードあり 名前 誕生日 でテーブルAに、テーブルBから名前と誕生日で一致するコードを検索 してテーブルAのコードに書き込みたい。 SQL、もしくはストアドプロシジャーで処理したいと思ってます。 処理件数は500前後です。 ストアドを試してみたのですが、コンパイル・エラーが出て上手くいきません。アドバイスをお願いします。

  • Oracle
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.3

>この場合、TAROの小さい方のコードを拾いたいです。 それでは、  update a set  code = (select min(b.code)  from b  where a.name = b.name  and a.birth = b.birth) これでどうでしょうか?

taaaaaaa
質問者

お礼

上手くいきました。 データ更新のため、phpでバッチを組んでいます。 以前はデータを1件づつ更新していてかなり時間がかかっていました。 こちらのSQLを利用すると450件ほどのデータ更新に35秒くらいと高速になりました。 またプログラムもシンプルに出来たのがうれしいです。 ありがとうございました。

その他の回答 (2)

回答No.2

>エラー行: 2: エラーが発生しました。 >ORA-01427: 単一行副問合せにより2つ以上の行が返されます。 ということは、テーブルBに 同じ名称で同じ誕生日の レコードが複数件存在するということが推測されますが。。 CODE NAME BIRTH ------------------------ AAAA TARO 2000/01/01 BBBB TARO 2000/01/01 CCCC JIRO 2000/12/10 DDDD SABURO 2000/12/31 このような場合は TARO のコードって どうします??

taaaaaaa
質問者

補足

この場合、TAROの小さい方のコードを拾いたいです。 AAAA ⇒ 10001 BBBB ⇒ 20001 コードはすべて4~5桁の数字です。

回答No.1

update a set code = (select b.code from b where a.name = b.name and a.birth = b.birth) a : テーブルA b : テーブルB code : コード フィールド name : 名前 フィールド birth : 誕生日 フィールド こんなカンジでどうでしょうか? 一致するものが存在しない場合は コードは null になりますので、それがイヤであれば nvl関数を使用してください。

taaaaaaa
質問者

補足

アドバイスありがとうございます。 試してみたのですが、 エラー行: 2: エラーが発生しました。 ORA-01427: 単一行副問合せにより2つ以上の行が返されます。 と、エラーが出てしまいます。 レコード数は、 テーブルAが、400 テーブルBが、20000 と異なります。 Accessの更新クエリなどを使えば問題なく出来るので、クエリをオラクルのSQLなどに一発変換出来れば簡単なのですが。。。

関連するQ&A

  • SQL2005 ストアドUPDATEについて教えてください。

    SQL2005 ストアドUPDATEについて教えてください。 顧客マスタと、売上データがあり、顧客毎の売上データの売上金額の合計を 顧客マスタの累計金額にUPDATEする方法を教えてください。 顧客マスタ・・顧客コード、累計金額 売上データ・・売上日、顧客コード、売上金額 update 顧客マスタ set 累計金額=(select sum(B.売上金額) from 売データ as B where 売上日付>='2010/03/01' and 売上日付<='2010/06/30' group by B.顧客コード) from 顧客マスタ as A,売上データ as B where A.顧客コード=B.顧客コード サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や のエラーが出たり、期間中のすべての顧客の売上合計がセットされたり思うようになりません。 どなたか教えてください。 宜しくお願いします。

  • ストアドの書き方?

    Aテーブルに同じフィールドを持ったcsvをd, e, f, g と4つのフィールドを比べて 1つでも違っていたら、insertするというSQLをつくりたいのですが、 これは、ストアドになるのでしょうか? データはだいたい5万件くらいあります。 サーバーはSQLServerになります。 宜しくお願い致します。

  • ストアドにしたらエラーになる

    10gを使ってます。 1.ワークテーブル作成 2.そのテーブルにインサート の一連のスクリプトをsql/plusかなんかでやると問題ないのに それをストアドにしたら2.の時にテーブルが存在しないと言うことで コンパイルエラーになってしまいます。 こうゆう場合どうすればコンパイルエラーを回避できるのでしょうか? 1.と2.を分割して二つのストアドにしないといけないのでしょうか。

  • Access2000のSQL文の質問です。

    Access2000のSQL文の質問です。(長文) [OYA]テーブルに、OYA_CODE(KEY),OYA_NAMEのフィールドがあります。   データは、1 , A 2 , B です。 [KO]テーブルに、KO_CODE(KEY),KO_NAMEのフィールドがあります。   データは、11 , A-1 12 , A-2 13 , A-3 21 , B-1 22 , B-2 です。 [TENKAI]テーブルに、OYA_CODE(KEY),KO_CODE(KEY),CNTのフィールドがあります。   データは、1 , 11 , 1 1 , 12 , 2 2 , 21 , 3 2 , 22 , 4 です。 [DATA]テーブルに、OYA_CODE(KEY),KO_CODE(KEY),CNTのフィールドがあります。   データは、1 , 11 , 10 1 , 12 , 20 2 , 21 , 100 2 , 22 , 200 です。 結果を OYA_CODE, OYA_NAME, KO_CODE, KO_NAME, KEI 1, A, 10 1, A, 11, A-1, 10 1, A, 12, A-2, 40 2, B, 100 2, B, 21, B-1, 300 2, B, 22, B-2, 800 と、したいのです。 つまり、[TENKAI]のCNT×[DATA]のCNT が、ほしいのです。 ネックは、OYA_CODEのみのレコードが出ないのです。 このテーブルにこう言うフィールドをつける等、 具体的にご支持を頂ければ幸いです。 宜しくお願い致します。

  • ストアドから別のストアドを作成できますか?

    パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか? アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。 「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、 パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。 そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、 ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、 別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。 ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。

  • ストアドのフィールド指定方法

    MS SQL Server7.0のストアドプロシージャについての質問です。 複数のフィールドを持つテーブルの、各フィールドに入ってる値を順番に調べる方法について教えて下さい。 具体的には、フィールドは"月日_01"から"月日_31"まであり、各フィールドには"1"か"0"のどちらかの値を持ってます。この31個のフィールド値を調べて、"1"と"0"の各合計値を求めたいです。 ADOのレコードセットなら、Fields でフィールドのインデックス値を指定出来ますので簡単にループ処理できますが、ストアドの場合インデックスによるフィールド指定がうまく出来ません。 現在はIF文で各フィールドを一つづつ判定してる状態です。もっとスムーズに行う方法がありましたらご教授下さい!どうぞ宜しくお願いします。

  • SQLの書き方について教えてください。

    SQL Server2000で下記のようなSQL文を書きたいと思っています。 テーブルAとテーブルAに無関係な2個のフィールドを 持つテーブルBがあり、テーブルAのデータをテーブルBにコピー したいと考えています。その際にテーブルBの2個のフィールドに対して 決められた値を挿入したいのですがどのように記述すればよいのか わかりません。 お分かりの方お教えいただけませんでしょうか よろしくお願いいたします。 下記の記述をしています。 INSERT INTO テーブルB ( A, B, C, D ) SELECT テーブルA.A, テーブルA.A, XXX1, XXX2 FROM reserveSETdateTRN; Cに東京 Dに品川 を入れたいと思っています

  • ストアドプロシージャについて

    Access2003とSQL Server2005Expressです。 初歩的な質問で恐縮です。 以下のストアドプロシージャのデータ取得先を、テーブルではなく 別のストアドプロシージャにしたいのですが、 その方法がわかりません。 CREATE PROCEDURE テスト AS SELECT コード, 社名, 住所, 電話 FROM 名簿     ↑     これをテーブルではなく、別のストアドプロシージャを     指定したのですが・・・。     ここをストアドプロシージャ名にするとエラーになります。     どうすればよろしいでしょうか?

  • SQLアドバイスください。

    テーブルA 項目名:ID(Key シーケンシャルカウント)、顧客ID(KEY)、管理NO、金額 (1) 01 0001 A001  5000 (2) 02 0001 A001 10000 (3) 03 0001 A001 10000 (4) 04 0001 A001 2000 (5) 05 0002 A001 4000 (6) 06 0003 A001 3000 (7) 07 0003 A001 3000 こういう状態のテーブルがあります。 (更新処理上で重複データが出来てしまいました) やりたい事はこの重複データが何件あるか?そしてその修正ですが、 (2)(3)と(6)(7)は重複です。抽出条件はなくただ前と同じデータが次のレコードに作成されたという事 この場合の重複データ件数は、2件になります。 修正後のテーブルはこうなりたいです。 (1) 01 0001 A001  5000 (2) 02 0001 A001 10000 (4) 04 0001 A001 2000 (5) 05 0002 A001 4000 (6) 06 0003 A001 3000 重複データが何件あるか?そしてその修正方法ですが、 PL/SQLを使用しないで出来ますか? やりかたを教えてください。

  • こんなSQLを教えてください

    こんなSQLを教えてください <更新前> テーブル1 |キー|コード| | 1|  a| | 2|  b| | 3|  c| テーブル2 |キー|コード| | 2|  B| | 4|  D| <更新後> テーブル1 |キー|コード| | 1|  a| | 2|  B| | 3|  c| こんなふうに テーブル1と同じデータがテーブル2にあったら テーブル1を書き換えるUPDATE文を教えてください