Выполните обновление через левое соединение в Снежинке

Обычно я создавал бы эту таблицу с одним оператором 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?

5 ответов

Согласно документации здесь вы не используете 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;

Чтобы добиться левого соединения в предложении where в Snowflake, можно использовать оператор (+).

update table1 x set x.value = coalesce(n.value2, 9999) from table2 n where ( x.id = n.id(+))

Документацию можно найти здесь

Outer joins can be specified in the WHERE clause using the (+) syntax. To specify an outer join using (+), the columns from the NULL-augmented table of the join are annotated with the (+) in the WHERE clause.

@Simon Darr. Левые соединения часто требуются в обновлениях, чтобы гарантировать, что для несоответствующих записей установлено значение NULL. Например, если у вас есть набор записей с существующими значениями и вы хотите выполнить обновление, чтобы перезаписать эти значения, на основе объединенных подтаблиц, вы захотите убедиться, что для всех записей, для которых нет присоединенных подзаписей, установлено значение NULL. .

Использование INNER JOIN (или WHERE в Snowflake) означает, что записи без соответствующих подзаписей будут исключены из обновления, таким образом, значения этих записей останутся неизменными. В результате останутся старые, устаревшие и потенциально недействительные данные. Вы можете обойти это, используя шаги to, сначала обнуляя все значения, а затем выполняя обновление, но это кажется очень неэффективным и подверженным ошибкам по сравнению с тем, что можно сделать в SQL Server с помощью LEFT JOIN.

Вы можете разделить задачу на два отдельных запроса, обрабатывая, когда таблицы совпадают, а когда нет.

Если они не совпадают, вы можете использовать синтаксис WHERE NOT EXISTS:

      update x
set x.value = 9999
from x
where not exists (select 1
                  from n
                  where x.id = n.id)

И когда они совпадают:

      update x
set x.value = n.value2
from n
where x.id = n.id

мы можем использовать слияние, чтобы сойти с рук

объединить таблицуa a с помощью (выберите b.colpkb, b.colx, c.coly, c.colpkc из таблицыa b левую таблицу соединенийb c на b.colpkb = c.colpkc) lf на a.colpkb = lf.colpkb при совпадении затем обновите установите a.colx =lf.colx;

Другие вопросы по тегам