#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