- ベストアンサー
効率的な方法でSQL、ストアドでのUPDATEを実行する方法を教えてください
- テーブルAとテーブルBのデータ更新を効率的に行う方法についてアドバイスをお願いします。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索し、テーブルAのコードに書き込みたいと思っています。処理件数は約500件です。
- SQLまたはストアドプロシージャを使用して、テーブルAとテーブルBのデータ更新を効率的に行う方法についてアドバイスをお願いします。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索し、テーブルAのコードに書き込みたいと考えています。処理件数はおよそ500件です。
- テーブルAとテーブルBのデータ更新を効率的に行う方法について教えてください。テーブルAにはコード、名前、誕生日のフィールドがあり、テーブルBから名前と誕生日の一致するコードを検索してテーブルAのコードに書き込みたいと考えています。処理件数は約500件です。SQLまたはストアドプロシージャを使用した処理方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>この場合、TAROの小さい方のコードを拾いたいです。 それでは、 update a set code = (select min(b.code) from b where a.name = b.name and a.birth = b.birth) これでどうでしょうか?
その他の回答 (2)
- impreza1555
- ベストアンサー率40% (2/5)
>エラー行: 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 のコードって どうします??
補足
この場合、TAROの小さい方のコードを拾いたいです。 AAAA ⇒ 10001 BBBB ⇒ 20001 コードはすべて4~5桁の数字です。
- impreza1555
- ベストアンサー率40% (2/5)
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関数を使用してください。
補足
アドバイスありがとうございます。 試してみたのですが、 エラー行: 2: エラーが発生しました。 ORA-01427: 単一行副問合せにより2つ以上の行が返されます。 と、エラーが出てしまいます。 レコード数は、 テーブルAが、400 テーブルBが、20000 と異なります。 Accessの更新クエリなどを使えば問題なく出来るので、クエリをオラクルのSQLなどに一発変換出来れば簡単なのですが。。。
お礼
上手くいきました。 データ更新のため、phpでバッチを組んでいます。 以前はデータを1件づつ更新していてかなり時間がかかっていました。 こちらのSQLを利用すると450件ほどのデータ更新に35秒くらいと高速になりました。 またプログラムもシンプルに出来たのがうれしいです。 ありがとうございました。