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