我遇到以下示例的问题。
我有2个表,快照和暂存。暂存包含以下列:
|person_id|column_changed|new_value|
|1 | color | orange |
|1 | sport | football|
快照包含以下列:
|person_id| color| sport |
|1 | blue | tennis|
我需要使用登台表中的new_value更新快照表中的列(来自staging的changed_column中的值)。
以下查询是我在此简化示例中手动执行的操作。
update snapshot a
set
a.color='orange',
a.sport='football'
from staging b
where a.person_id=b.person_id
有没有办法相对引用所需的列而不是手动提供更新列+字段?有没有办法引用a。' columns_changed' = b。' new_value'在set谓词?
答案 0 :(得分:0)
有两种方法可以做你想要的。第一个是多个更新:
update snapshot s
set color = st.new_value
from staging st
where st.person_id = s.person_id and st.column_changed = 'color';
update snapshot s
set sport = st.new_value
from staging st
where st.person_id = s.person_id and st.column_changed = 'sport';
或者,预先聚合并立即执行所有操作:
update snapshot s
set color = coalesce(st.color, s.color),
sport = coalesce(st.sport, s.sport)
from (select st.person_id,
max(case when st.column_changed = 'color' then st.new_value end) as color,
max(case when st.column_changed = 'sport' then st.new_value end) as sport
from staging st
group by st.person_id
) st
where st.person_id = s.person_id;
(这实际上假设新值永远不会是NULL
。)
挑战是什么?好吧,加入staging
会导致一些行被多次更新 - 例如一次换颜色,一次换一次运动。不幸的是(或者幸运的是),update
不会累积。只有一个是任意执行的。
所以,你的第一种方法是不会起作用的。以上两种方法是我想到的。也许还有第三种方式。