ОБНОВИТЬ с помощью SELECT со ссылкой на обновленную таблицу

#sql-server

#sql-server

Вопрос:

У меня есть скрипт:

 UPDATE  a
SET fieldX =
  (SELECT F_Aggregate(x.fieldy)
  FROM  table_B
  INNER JOIN ....
  INNER JOIN ....
  INNER JOIN ....
  ....
  INNER JOIN table_C on .....
  WHERE table_C.fieldY = table_A.fieldY)
FROM table_A a;
 

Но теперь я хочу обновлять fieldX только тогда, когда select дает другое значение.
Нравится:

 UPDATE  a
SET fieldX =
    (SELECT dbo.F_Aggregate(x.fieldy) as result
    FROM  table_B
    INNER JOIN ....
    INNER JOIN ....
    INNER JOIN ....
    ....
    INNER JOIN table_C on .....
    WHERE table_C.fieldY = table_A.fieldY)
FROM table_A a
WHERE fieldX <> result;
 

Я нашел вопросы / ответы, которые выглядят следующим образом, но все они имеют оператор select без ссылки на обновленную таблицу.
Кто-нибудь знает решение?

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

1. Поместите его во внутренний select INNER JOIN table_C on ..... WHERE table_C.fieldY = table_A.fieldY AND table_A.fieldX <> dbo.F_DoSomeThing(x.fieldy)

2. вместо использования subselect — просто включите table_a в инструкцию join и обновите, если значения отличаются. Вы можете обновлять на основе объединений

3. @artm функция не может быть в предложении where, потому что это агрегированная функция. Но если бы это было возможно, он все равно обновил бы все строки таким образом.

Ответ №1:

Переместите вычисление в другое Data Source — это может быть CTE, табличная переменная или временная таблица и т. Д. Затем присоедините обновленную таблицу к ней:

 WITH DataSource (fieldY, result)  AS
(
    SELECT table_C.fieldY
          ,dbo.F_Aggregate(x.fieldy) as result
    FROM  table_B
    INNER JOIN ....
    INNER JOIN ....
    INNER JOIN ....
    ....
    INNER JOIN table_C on .....
    GROUP BY table_C.fieldY 

)
UPDATE  table_A
SET fieldX = result
FROM table_A A
INNER JOIN DataSource DS
    ON A.[fieldY] = DS.[fieldY]
WHERE fieldX <> result