Обновление СЛИЯНИЯ снежинок/вставка всех столбцов

#sql #merge #snowflake-cloud-data-platform #upsert

Вопрос:

Поддерживает ли snowflake обновление/вставку всех столбцов с синтаксисом, подобным UPDATE * или INSERT *

  MERGE INTO events 
 USING updates 
      ON events.eventId = updates.eventId
 WHEN MATCHED THEN 
      UPDATE *
 WHEN NOT MATCHED THEN 
       INSERT *  
 

аналогично тому, как это делает Databricks: https://docs.databricks.com/spark/latest/spark-sql/language-manual/delta-merge-into.html

Или нам нужно перечислить каждый столбец и его значение ?

Я получаю ошибку, когда пытаюсь выполнить описанное выше

синтаксическая ошибка … неожиданное «*».

и документы не очень помогают: https://docs.snowflake.com/en/sql-reference/sql/merge.html

Спасибо,

Комментарии:

1. Я довольно новичок в Snowflake, но я знаю, что он стремится эмулировать синтаксис Postgres, хотя в Postgres нет такого MERGE , как в Sql Server. В любом случае, мне кажется, в документации довольно ясно, что вам понадобится SET предложение для каждого столбца, как того требуют Postgres и Sql Server. Это классная функция, которую предлагает Databricks, но я впервые вижу такой синтаксис.

Ответ №1:

UPDATE SET */INSERT * Это расширения языка SQL(не определенные в стандарте SQL).

Снежинка не поддерживает такой синтаксис:

поглощать:

 matchedClause ::=
  WHEN MATCHED [ AND <case_predicate> ] 
  THEN { UPDATE SET <col_name> = <expr> [ , <col_name2> = <expr2> ...] 
         | DELETE }[...]

notMatchedClause ::=
  WHEN NOT MATCHED [ AND <case_predicate> ] 
  THEN INSERT [ ( <col_name> [ , ... ] ) ] VALUES ( <expr> [ , ... ] )
 

Вы можете проголосовать за такую функцию по адресу: https://community.snowflake.com/s/ideas

Уже есть пункт под названием: «неявное обновление и поддержка вставки для СЛИЯНИЯ В»