Oracle 別表(別テーブル)から値をコピーして一括更新する
- 2006.08.01
- Oracle
別のテーブルからフィールドの値をコピーしてUPDATEしたいときがある。
郵便番号の一覧表から、都道府県をコピーする。などというときに使う。
UPDATE時に、SELECT結果を用いるというやり方で実施する。
■別表からコピーして行を更新する
自分の住所録の住所欄に郵便番号リストの住所をコピーする。(全ての行を一括で更新)
SQL> UPDATE my_addr 2 SET jusho = (SELECT jusho 3 FROM zip_list 4 WHERE zip_no = my_addr.zip_no) ;
一部の行だけ変更したいとき。(WHEREで指定する)
SQL> UPDATE my_addr 2 SET jusho = (SELECT jusho 3 FROM zip_list 4 WHERE zip_no = my_addr.zip_no) 5 WHERE jusho IS NULL ;
複数の列(カラム)を変更したいとき。
SQL> UPDATE my_addr 2 SET ( jusho, tel ) = (SELECT jusho, tel 3 FROM zip_list 4 WHERE zip_no = my_addr.zip_no) ;
確認してOKだったら commit; を忘れずに実行する。
■販売店テーブルの一部の店名が新しくなった場合
吸収合併等で社名が変わるのは、よくある話し。
わざと正規化していないテーブルだと、販売時の店名を残しておくことができることがメリット。でも「今の会社名に変更したいよね」なんてこともある。
古い販売店テーブル
ID | 販売店名 |
1 | よろず屋 |
2 | 三河屋 |
3 | イズミヤ |
新しい販売店テーブル
ID | 販売店名 | 変更対象 |
1 | スーパーよろずや | はい |
2 | 三河屋 | いいえ |
3 | Too | はい |
販売記録テーブル
ID | 販売した商品 | 販売先ID | 販売先の名前 |
1001 | みかん | 1 | よろずや |
1002 | みかん | 2 | 三河屋 |
1003 | みかん | 3 | イズミヤ |
1004 | みかん | 28 | 玉川屋 |
1005 | みかん | 29 | 伊勢屋 |
期待する、更新後の販売記録テーブル
ID | 販売した商品 | 販売先ID | 販売先の名前 |
1001 | みかん | 1 | スーパーよろずや |
1002 | みかん | 2 | 三河屋 |
1003 | みかん | 3 | Too |
1004 | みかん | 28 | 玉川屋 |
1005 | みかん | 29 | 伊勢屋 |
一括更新する方法、その1。
SQL> UPDATE 販売記録テーブル 2 SET ( 販売先の名前 ) 3 = ( 4 SELECT 販売店名 5 FROM 販売店テーブル 6 WHERE id = 販売記録テーブル.id 7 ) ;
実行すると、販売記録テーブルの全件が更新される。
一括更新する方法、その2。
SQL> UPDATE 販売記録テーブル 2 SET ( 販売先の名前 ) 3 = ( 4 SELECT 販売店名 5 FROM 販売店テーブル 6 WHERE id = 販売記録テーブル.id 7 ) 8 WHERE 販売先ID 9 IN ( SELECT id FROM 販売店テーブル WHERE 変更対象 like 'はい' ) ;
変更対象を ‘はい’ に絞ることで、販売記録テーブルの2件だけが更新される。
一括更新する方法、その3。
SQL> UPDATE 販売記録テーブル 2 SET ( 販売先の名前, 販売先の住所, 販売先の電話番号 ) 3 = ( 4 SELECT 販売店名, 住所, 電話番号 5 FROM 販売店テーブル 6 WHERE id = 販売記録テーブル.id 7 ) ;
複数の列(カラム)も、合わせて一括更新したいとき。
-
前の記事
Oracleで表のコピーを作成する 2006.08.01
-
次の記事
EOModelerでリレーションシップを張る 2006.08.02