如何将“冲突时无所作为”从PostgreSQL迁移到Snowflake?

时间:2019-02-22 14:01:11

标签: upsert snowflake

我正在迁移大量PostgreSQL脚本以在Snowflake中工作。使我困扰的问题是on conflict语法,尤其是当您使用on conflict do nothing时。

insert into table1
  select 
    user_id
  , something_else
from table2
on conflict do nothing;

有人建议Postgres使用on conflictsome are not happy about it来等效merge into。但是,当您使用merge into时,必须指定一个on <CONDITION>子句,例如merge into t1 using t2 on t1.id = t2.id ...

但是如果使用on conflict do nothing,应该怎么做?

在这种情况下,使用merge into时比指定每列的语法更详细吗? (假设您有15列,而您必须写其中的每一列)。

1 个答案:

答案 0 :(得分:1)

尝试一下(假设您要使用user_id作为唯一性标准)

merge into table1
using (select user_id, something_else from table2) sub
on sub.user_id = table1.user_id
when not matched then insert values(sub.user_id, sub.something_else)

或者简单地消除具有现有user_id

的行
insert into table1
select user_id, something_else from table2
where user_id not in (select user_id from table1)

或者如果您只想防止全行重复,请执行

insert into table1 ( 
  select user_id, something_else from table2
  minus
  select * from table1
)