带连接的Redshift表更新

时间:2016-08-05 09:28:57

标签: postgresql join amazon-redshift

我有3个表t1,t2和t3 t1有2列 - > id1,val1

t2 -> id2, val2  
t3 -> id3, val3  
If id1=id2 and id2 = id3 

然后我需要更新val1 ad val3。 但我重复了id1,每个都应该有相同的val3

我正在使用

update  t1
inner join  t2 on t1.id1 = t2.id2
inner join  t3 on t2.id2 = t3.id3
set t1.val1 =  t3.val3
;

但不能这样做。

3 个答案:

答案 0 :(得分:7)

我需要从Redshift上的另一个表t2.val3获取值。我使用了以下

update t1 
set val1 = t2.val3
from t2 join t1 t on t.id = t2.id;

我必须重新命名t1。否则Redshift抱怨。

答案 1 :(得分:3)

正确的语法是:

  

UPDATE table_name SET column = { expression | DEFAULT} [,...]
  [FROM fromlist ]
  [WHERE 条件]

因此,您的UPDATE语句应如下所示:

update t1 set val1 = val3
from t2 inner join t3 on t2.id2 = t3.id3
where t1.id1 = t2.id2
;

请参阅Redshift documentation及其全面的UPDATE examples

答案 2 :(得分:1)

每个@jie 解决方案,但扩展了一点并且没有表别名作为表名的干扰(呵呵):

update
  my_counts
set 
  my_count_delta = t1.my_count - t2.my_count
from
  my_counts t1 join
  my_counts t2 on
    t1.group_id = t2.group_id and 
    t2.count_dt = ( t1.count_dt - interval '1 day' )
where
  t1.count_error is null

一些注意事项:

  • my_count 是一个运行总数
  • my_count_delta 是前一天条目的变化 (-/+)
  • 解决了存在running total但需要添加delta的汇总列数据的问题
  • :heart: pg style sql 如何让日期加减如此简单:( t1.count_dt - interval '1 day' )
  • 作为 LEFT JOIN 的狂热爱好者,我感到困惑的是,这不会与左连接一起运行...错误消息非常清楚,需要“平衡连接”或者是“偶数连接”< /em>...所以我回到 JOIN 的 @jie 版本,发现查询非常快