Você não tem a UPDATE FROM
sintaxe proprietária do SQL Server desativada. Também não sei por que você precisou ingressar no CommonField
e também filtrá-lo posteriormente. Tente o seguinte:
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';
Se você está fazendo algo realmente bobo - como tentar constantemente definir o valor de uma coluna para o agregado de outra coluna (que viola o princípio de evitar o armazenamento de dados redundantes), você pode usar uma CTE (expressão de tabela comum) - veja aqui e aqui para mais detalhes:
;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];
A razão pela qual isso é realmente bobo é que você precisará executar novamente toda essa atualização toda vez que qualquer linha nas table2
alterações. A SUM
é algo que você sempre pode calcular em tempo de execução e, ao fazer isso, nunca precisa se preocupar que o resultado seja obsoleto.
UPDATE table1 a SET a.[field] = b.[field]
- removendo a um alias de funcionar, por issoUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Tente assim:
fonte
A resposta dada acima por Aaron é perfeita:
Só quero adicionar por que esse problema ocorre no SQL Server quando tentamos usar o alias de uma tabela durante a atualização dessa tabela; a sintaxe abaixo mencionada sempre dará erro:
case pode ser qualquer um, se você estiver atualizando uma única tabela ou atualizando enquanto estiver usando junção.
Embora a consulta acima funcione bem no PL / SQL, mas não no SQL Server.
A maneira correta de atualizar uma tabela ao usar o alias da tabela no SQL Server é:
Espero que ajude a todos por que o erro veio aqui.
fonte
fonte
Parece que o SQL Server 2012 também pode lidar com a sintaxe de atualização antiga do Teradata:
Se bem me lembro, 2008R2 estava dando erro quando tentei uma consulta semelhante.
fonte
Acho útil transformar um UPDATE em um SELECT para obter as linhas que quero atualizar como teste antes de atualizar. Se eu puder selecionar as linhas exatas que eu quero, eu posso atualizar apenas as linhas que eu quero atualizar.
fonte
Mais alternativas aqui .
fonte
Outra abordagem seria usar MERGE
-Merge faz parte do padrão SQL
-Também tenho certeza de que as atualizações de junção interna não são determinísticas. Pergunta semelhante aqui onde a resposta fala sobre isso http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. html
fonte
MERGE
.Eu tive o mesmo problema .. e você não precisa adicionar uma coluna física .. porque agora você terá que mantê-la .. o que você pode fazer é adicionar uma coluna genérica na consulta de seleção:
EX:
fonte
A abordagem de Aaron acima funcionou perfeitamente para mim. Minha declaração de atualização foi um pouco diferente porque eu precisava ingressar com base em dois campos concatenados em uma tabela para corresponder a um campo em outra tabela.
fonte
Tentar:
fonte
table1
, não apenas as linhas em que há uma correspondência no campo comum entre as duas tabelas (efetivamente uma junção esquerda e não uma junção interna).BatchNo = '110'
, certo? Todas as votações negativas ocorreram como resultado desse efeito ou outras pessoas tiveram outras razões para votar negativamente?NULL
, e esse formulário pode ser uma solução específica menos para T-SQL.