アプリ版:「スタンプのみでお礼する」機能のリリースについて

テーブルA、テーブルBがあってデータ更新の効率的な方法を探しています。


フィールドはそれぞれ、コード、名前、誕生日 があって、

データ、
-----------------------------
A コードなし 名前誕生日
Bコードあり 名前誕生日

でテーブルAに、テーブルBから名前と誕生日で一致するコードを検索
してテーブルAのコードに書き込みたい。

SQL、もしくはストアドプロシジャーで処理したいと思ってます。
処理件数は500前後です。

ストアドを試してみたのですが、コンパイル・エラーが出て上手くいきません。アドバイスをお願いします。

A 回答 (3件)

>この場合、TAROの小さい方のコードを拾いたいです。



それでは、

 update a set
 code = (select min(b.code)
 from b
 where a.name = b.name
 and a.birth = b.birth)

これでどうでしょうか?
    • good
    • 0
この回答へのお礼

上手くいきました。

データ更新のため、phpでバッチを組んでいます。
以前はデータを1件づつ更新していてかなり時間がかかっていました。

こちらのSQLを利用すると450件ほどのデータ更新に35秒くらいと高速になりました。
またプログラムもシンプルに出来たのがうれしいです。

ありがとうございました。

お礼日時:2005/01/20 16:59

>エラー行: 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桁の数字です。

補足日時:2005/01/20 15:06
    • good
    • 0

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などに一発変換出来れば簡単なのですが。。。

補足日時:2005/01/20 11:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す