ここから本文です

SQL文について質問です。 同テーブル内で、主キーのみを変更し、残りのデータは丸々...

yuuto3993さん

2009/9/3008:43:54

SQL文について質問です。
同テーブル内で、主キーのみを変更し、残りのデータは丸々同じものを追加したいです。(コピー)

コードを主キーとした住所録というマスタがあるとします

【住所録】SQL実行前

コード|名称|住所|・・・×n
-----------------------------
511000 ああ 東京
512000 いい 千葉
513000 うう 埼玉


これを主キーをある形態に基づいて変更したキーで新データとして追加したい(コピー)


(元) (新)
511000 ⇒ 101511
512000 ⇒ 101512
513000 ⇒ 101513


【住所録】SQL実行後

コード|名称|住所|・・・×n
-----------------------------
511000 ああ 東京
512000 いい 千葉
513000 うう 埼玉
101511 ああ 東京
101512 いい 千葉
101513 うう 埼玉



なるだけ簡略したSQL文で、これを実装したいです。


例えば、以下のように項目一つ一つに代入していけば結果的に実装されるとは思いますが
項目が多いのでそれをすべて入力していくのは好ましくありません。


update 住所録 set
コード = '101' || substr(コード,1,3)
,名称 = 名称
,住所 = 住所



×n
where コード between 500000 and 599000


何かスマートな方法があればご教授願います。

閲覧数:
25,218
回答数:
1

違反報告

ベストアンサーに選ばれた回答

javako_javaさん

編集あり2009/9/3009:07:25

項目が1つ変更されますので、全項目を並べる作業からは逃れられません。
目的はコピーですので、ほんの少し楽な、SELECT-INSERTが利用できます。
挿入するデータを作るSELECT文を作り、その頭にINSERT句を追加すると、結果をそのまま挿入することができます。

INSERT INTO
住所録
SELECT
'101' || substr(コード,1,3),
名称,
住所,
...
Xn
FROM
住所録
WHERE
コード between 500000 and 599000



どうしてもという場合には、一時テーブルで逃げる技もあります。

①仮住所録テーブルを作成し、住所録から対象レコードを取得して挿入する。
CREATE TABLE 仮住所録 AS SELECT * FROM 住所録 WHERE コード BETWEEN 500000 AND 599000

②仮住所録テーブル内で、キー値を全件変更
UPDATE 仮住所録 SET コード = '101' || substr(コード,1,3)

③仮住所録テーブルのレコードをすべて、住所録テーブルに挿入
INSERT INTO 住所録 SELECT * FROM 仮住所録

④仮住所録テーブルを破棄
DROP TABLE 仮住所録

質問した人からのコメント

2009/9/30 09:13:45

成功 ご回答ありがとうございます。
仮テーブルを用いて実装してみることにしてみます^^

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。