如何将 'on conflict do nothing' 从 PostgreSQL 迁移到 Snowflake?

How to migrate 'on conflict do nothing' from PostgreSQL to 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 conflict 的 "equivalent" 使用 merge intosome are not happy about it。但是,当您使用 merge into 时,您必须指定一个 on <CONDITION> 子句,例如merge into t1 using t2 on t1.id = t2.id ...

但是在 on conflict do nothing 的情况下应该选择什么?

在这些情况下,使用 merge into 时是否有比指定每一列更简洁的语法? (假设你有 15 列,你必须写 每一列 )。

试试这个(假设您想使用 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
)