Atualização Subquery Pergunta, com chave estrangeira
-
19-08-2019 - |
Pergunta
Eu misremembered que a chave era para esta tabela Templates e, portanto, eu adicionei o campo errado como uma chave estrangeira. Agora eu preciso adicionar a chave estrangeira e quero preencher os seus valores com base neste outro campo que já está preenchida. Comecei a tentar fazer isso com uma instrução de atualização, mas eu não tenho certeza de como fazê-lo.
A parte de meu esquema:
Produtos Tabela:
ProductName (key)
TemplateName
TemplateID
...
Eu adicionei TemplateID, mas não tem dados nele ainda e é anulável.
Modelos Tabela:
TemplateID (key)
TemplateName
...
Eu quero usar a tabela de modelos para encontrar o TemplateID correspondente para cada TemplateName na tabela Produtos e preenchimento que na referência de chave estrangeira na tabela de produtos.
Posso fazer isso com uma subconsulta em Update, ou que eu preciso para escrever algum tipo de Proc? Estou usando o SQL Server 2008
Solução
Você pode fazer isso com uma atualização simples consulta ??p>
UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName
Você não precisa especificar a tabela de produtos na cláusula FROM, nem uma cláusula de junção. Basta especificar a tabela Modelos na cláusula FROM. Você pode usar o nome da tabela que você usa na cláusula FOR UPDATE na cláusula WHERE, a recordds correlatas de ambas as tabelas.
Outras dicas
Aqui está uma solução participar. É significativo em que apenas os registros correspondentes serão atualizados.
Update p
Set p.TemplateId = t.TemplateId
From Products p
join Templates t
On p.TemplateName = t.TemplateName
Aqui está a solução subconsulta. Cada linha de produtos será atualizado, mesmo quando não houver correspondência.
Update p
Set p.TemplateId =
(
Select t.TemplateId
From Templates t
Where p.TemplateName = t.TemplateName
)
From Products p
update Templates
set TemplateId=Products.TemplateId
from Templates
inner join Products
on Templates.TemplateName=Products.TemplateName