使用外键更新子查询问题

时间:2009-01-23 14:25:45

标签: sql stored-procedures foreign-keys subquery

我错误地记下了这个模板表的密钥,因此我将错误的字段添加为外键。现在我需要添加外键,我想根据已经填充的其他字段填充其值。我开始尝试使用更新语句来执行此操作,但我不确定如何执行此操作。

我的架构的一部分:

产品表:

ProductName (key)
TemplateName
TemplateID
...

我添加了TemplateID,但它还没有数据,可以为空。

模板表:

TemplateID (key)
TemplateName
...

我想使用Templates表为Products表中的每个TemplateName查找匹配的TemplateID,并在Products表的外键引用中填充它。

我可以在Update中使用子查询执行此操作,还是需要编写某种存储过程?我正在使用Sql Server 2008

3 个答案:

答案 0 :(得分:2)

您可以使用简单的UPDATE查询

来完成
UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName

您不需要在FROM子句中指定Products表,也不需要在JOIN子句中指定。 只需在FROM子句中指定Templates表即可。 您可以使用WHERE子句中UPDATE子句中使用的表名来关联两个表中的记录。

答案 1 :(得分:1)

这是一个加入解决方案。它的重要性在于只会更新匹配的行。

Update p
Set p.TemplateId = t.TemplateId
From Products p
  join Templates t
  On p.TemplateName = t.TemplateName

这是子查询解决方案。即使没有匹配项,每一行产品都会更新。

Update p
Set p.TemplateId =
(
  Select t.TemplateId
  From Templates t
  Where p.TemplateName = t.TemplateName
)
From Products p

答案 2 :(得分:0)

update Templates
set TemplateId=Products.TemplateId
from Templates
inner join Products
   on Templates.TemplateName=Products.TemplateName