通过Snowflake中的左联接执行更新

时间:2018-12-04 03:54:29

标签: snowflake-datawarehouse

通常,我将使用一个带有相关子查询的SELECT语句制作此表,但是我不能在Snowflake中吗?无论如何,我想更新表中的所有行,对于不匹配的行使用特殊值(9999)。 在T-SQL中,我会做类似的事情

update x
set x.value = coalesce(n.value2, 9999)
from x
left join n
on x.id = n.id

如何在Snowflake中做同样的事情?

3 个答案:

答案 0 :(得分:1)

@Simon Darr 在更新中经常需要左连接以确保不匹配的记录设置为 NULL。例如,如果您有一组具有现有值的记录,并且您想根据连接的子表进行更新以覆盖这些值,您需要确保没有连接子记录的任何记录都设置为 NULL .

通过使用 INNER JOIN(或 Snowflake 中的 WHERE),这意味着没有匹配子记录的记录将被排除在更新之外,从而使这些记录上的值保持不变。这会留下旧的、过时的和可能无效的数据。您可以通过使用 to 步骤来解决这个问题,首先将所有值清零,然后进行更新,但与使用 LEFT JOIN 在 SQL Server 中所做的相比,这似乎效率极低且容易出错。

答案 1 :(得分:0)

根据文档here,您不使用JOIN关键字,而是在WHERE中使用联接,如下所示:

update t1
  set t1.number_column = t1.number_column + t2.number_column, t1.text_column = 'ASDF'
from t2
where t1.key_column = t2.t1_key and t1.number_column < 10;

答案 2 :(得分:-1)

我们可以使用合并来解决这个问题

merge tablea a 
using (
select b.colpkb,b.colx , c.coly,c.colpkc
from tablea b 
left join tableb c on b.colpkb=c.colpkc
) lf
on a.colpka= lf.colpkb
when matched 
then update 
set 
a.colx=lf.colx;