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 ) ;

複数の列(カラム)も、合わせて一括更新したいとき。