Ваш исходный запрос - это стандартный скалярный подзапрос SQL-92 **. Одна из причин, по которой он предпочтет (кроме понятий переносимости), заключается в том, что собственный синтаксис UPDATE..FROM..JOIN
в SQL Server дает потенциально неоднозначные и неожиданные результаты.
Однако подход «скалярный подзапрос», безусловно, многословен (хотя умный оптимизатор обнаружит повторяющийся код). В качестве стандарта в SQL-99 был введен оператор MERGE
, который был реализован (с полезными расширениями) в SQL Server 2008, например.
MERGE INTO destination_table
USING src_table t2
ON t2.pk = destination_table.pk
WHEN MATCHED THEN
UPDATE
SET field1 = T2.field1,
field2 = T2.field2,
field2 = T2.field3,
...
field40 = T2.field40;
Поскольку вы не поддерживаете унаследованный (до 2008 года) код и предполагаете, что у вас нет непосредственных планов портировать на продукт SQL, который не поддерживает MERGE (отмечая, что Oracle и postgreSQL поддерживают, а mySQL нет), я не вижу причин для этого. использовать любую конструкцию, отличную от MERGE
, для такого рода обновлений.
** ну почти. Ваше обновление предназначено для таблицы с именем корреляции 't1`. В SQL-92 имя корреляции должно иметь эффект материализации таблицы, которая выходит из области видимости в конце оператора SQL. Другими словами, хотя синтаксис действителен, результатом должно быть то, что данные в базовой базовой таблице остаются неизменными. Тем не менее, кажется очевидным, что это не является целью вашего обновления, и в действительности SQL Server действительно влияет на базовые таблицы, что является технически несовместимым поведением!