Как перенести «в конфликте ничего не делать» из PostgreSQL в Snowflake? - PullRequest
0 голосов
/ 22 февраля 2019

Я перевожу огромный кусок скрипта PostgreSQL для работы в Snowflake.Проблема, которая остановила меня, заключается в синтаксисе on conflict и, в частности, когда вы используете on conflict do nothing.

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

. Некоторые предлагают «эквивалент» on conflict от Postgres использует 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 голосов
/ 23 февраля 2019

Попробуйте это (предполагается, что вы хотите использовать 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
)
...