У вас не совсем запатентованный UPDATE FROM
синтаксис SQL Server . Также не уверен, почему вам нужно присоединиться к, CommonField
а также фильтровать его позже. Попробуй это:
UPDATE t1
SET t1.CalculatedColumn = t2.[Calculated Column]
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.CommonField = t2.[Common Field]
WHERE t1.BatchNo = '110';
Если вы делаете что-то действительно глупое - например, постоянно пытаетесь установить значение одного столбца в совокупность другого столбца (что нарушает принцип избегания хранения избыточных данных), вы можете использовать CTE (общее табличное выражение) - см. Здесь а здесь для более подробной информации:
;WITH t2 AS
(
SELECT [key], CalculatedColumn = SUM(some_column)
FROM dbo.table2
GROUP BY [key]
)
UPDATE t1
SET t1.CalculatedColumn = t2.CalculatedColumn
FROM dbo.table1 AS t1
INNER JOIN t2
ON t1.[key] = t2.[key];
Причина, по которой это действительно глупо, заключается в том, что вам придется перезапускать все это обновление каждый раз, когда в строку вносятся table2
изменения. A SUM
- это то, что вы всегда можете вычислить во время выполнения, и при этом никогда не нужно беспокоиться о том, что результат устарел.
UPDATE table1 a SET a.[field] = b.[field]
- удаление псевдонима работает, так чтоUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Попробуйте это так:
источник
Ответ, данный выше Аароном, совершенен:
Просто хочу добавить, почему эта проблема возникает в SQL Server, когда мы пытаемся использовать псевдоним таблицы при обновлении этой таблицы, приведенный ниже синтаксис всегда будет выдавать ошибку:
регистр может быть любым, если вы обновляете одну таблицу или обновляете при использовании объединения.
Хотя приведенный выше запрос будет хорошо работать в PL / SQL, но не в SQL Server.
Правильный способ обновления таблицы при использовании псевдонима таблицы в SQL Server:
Надеюсь, это поможет всем, почему ошибка пришла сюда.
источник
источник
Похоже, что SQL Server 2012 также может обрабатывать старый синтаксис обновления Teradata:
Если я правильно помню, 2008R2 выдавал ошибку, когда я пытался подобный запрос.
источник
Я считаю полезным превратить UPDATE в SELECT, чтобы получить строки, которые я хочу обновить в качестве теста перед обновлением. Если я могу выбрать нужные мне строки, я могу обновить только те строки, которые я хочу обновить.
источник
Больше альтернатив здесь .
источник
Другой подход будет использовать MERGE
-Merge является частью стандарта SQL
-Также я почти уверен, что обновления внутреннего соединения не являются детерминированными. Подобный вопрос здесь, где ответ говорит об этом http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. HTML
источник
MERGE
.У меня была та же проблема .. и вам не нужно добавлять физический столбец .. потому что теперь вам нужно будет поддерживать его .. что вы можете сделать, это добавить общий столбец в запросе выбора:
EX:
источник
Подход Аарона выше работал отлично для меня. Мой оператор обновления немного отличался, потому что мне нужно было объединить на основе двух полей, соединенных в одной таблице, чтобы соответствовать полю в другой таблице.
источник
Пытаться:
источник
table1
, а не только те строки, где есть совпадение в общем поле между обеими таблицами (фактически левое соединение, а не внутреннее соединение).BatchNo = '110'
, не так ли? Все ли отрицательные результаты произошли в результате этого эффекта, или у других были другие причины для понижающего голосования?NULL
, и эта форма может быть менее специфичным для T-SQL решением.