#経緯
ワーク(一時)テーブルのデータを本テーブルに登録する時の、複数のレコードを一括更新する方法を試してみましたので、
一応メモします。
##本テーブル(tbl01)の例
年月(year_mon) | 名前(name) | 指数(index) |
---|---|---|
202001 | name1 | 123.45 |
202001 | name2 | 234.56 |
202001 | name3 | 345.67 |
##ワークテーブル(tbl01_wk)の例
年月(year_mon) | 名前(name) | 指数(index) |
---|---|---|
202001 | name1 | 456.78 |
202001 | name2 | 567.89 |
202001 | name4 | 678.90 |
202001 | name5 | 789.01 |
#目標1:更新
年月と名前を検索のキーとして、ワークテーブルのデータを本テーブルのデータと比較して、異なる場合本テーブルの指数を更新
update
tbl01 as t1
set
index = t2.index
from
tbl01_wk as t2
where
t1.year_mon = t2.year_mon
and t1.name = t2.name
and t1.index <> t2.index
#目標2:追加
年月と名前を検索のキーとして、ワークテーブルのデータは本テーブルに存在するかを確認して、存在しない場合本テーブルに追加
insert into
tbl01
select
t1.year_mon,
t1.name,
t1.index
from
tbl01_wk as t1
left join
tbl01 as t2
on
t1.year_mon = t2.year_mon
and t1.name = t2.name
where
t2.year_mon is null
#目標3:order byを使用
order byを使用してワークからデータを抽出して本テーブルに更新
※一時ファイルをワークに登録し、「最新の数行だけ」を更新する場合に役立つ
ワークの「最新の5行」を本テーブルに更新
update
tbl01 as t1
set
index = t2.index
from
(
select
*
from
tbl01_wk
order by
year_mon desc
limit 5
) as t2
where
t1.year_mon = t2.year_mon
and t1.name = t2.name