Actualizar pregunta de subconsulta, con clave externa
-
19-08-2019 - |
Pregunta
No recuerdo cuál era la clave para esta tabla de Plantillas y, por lo tanto, agregué el campo incorrecto como clave externa. Ahora necesito agregar la clave externa y quiero llenar sus valores en función de este otro campo que ya está poblado. Empecé a intentar hacer esto con una declaración de actualización, pero no estoy seguro de cómo hacerlo.
Parte de mi esquema:
Tabla de productos:
ProductName (key)
TemplateName
TemplateID
...
He agregado TemplateID, pero todavía no tiene datos y es anulable.
Tabla de plantillas:
TemplateID (key)
TemplateName
...
Quiero usar la tabla de Plantillas para encontrar el TemplateID correspondiente para cada TemplateName en la tabla de Productos y completarlo en la referencia de clave externa en la tabla de Productos.
¿Puedo hacer esto con una subconsulta en Actualización, o necesito escribir algún tipo de Proceso almacenado? Estoy usando Sql Server 2008
Solución
Puede hacerlo con una simple consulta de ACTUALIZACIÓN
UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName
No necesita especificar la tabla Productos en la cláusula FROM, ni una cláusula JOIN. Simplemente especifique la tabla de plantillas en la cláusula FROM. Puede usar el nombre de la tabla que usa en la cláusula UPDATE en la cláusula WHERE, para correlacionar los registros de ambas tablas.
Otros consejos
Aquí hay una solución de unión. Es significativo porque solo se actualizarán las filas coincidentes.
Update p
Set p.TemplateId = t.TemplateId
From Products p
join Templates t
On p.TemplateName = t.TemplateName
Aquí está la solución de subconsulta. Cada fila de productos se actualizará, incluso cuando no haya coincidencias.
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