使用引用要更新的列的临时表更新基表[REDSHIFT]

时间:2018-03-10 22:58:40

标签: sql amazon-redshift

我遇到以下示例的问题。

我有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谓词?

1 个答案:

答案 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不会累积。只有一个是任意执行的。

所以,你的第一种方法是不会起作用的。以上两种方法是我想到的。也许还有第三种方式。