【问题标题】:Update Subquery Question, with foreign key使用外键更新子查询问题
【发布时间】:2009-01-23 14:25:44
【问题描述】:

我记错了这个模板表的键是什么,因此我添加了错误的字段作为外键。现在我需要添加外键,并且我想根据已经填充的其他字段填充它的值。我开始尝试使用更新语句来执行此操作,但我不知道该怎么做。

我的部分架构:

产品表:

ProductName (key)
TemplateName
TemplateID
...

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

模板表:

TemplateID (key)
TemplateName
...

我想使用 Templates 表为 Products 表中的每个 TemplateName 找到匹配的 TemplateID,并将其填写到 Products 表中的外键引用中。

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

【问题讨论】:

    标签: sql stored-procedures foreign-keys subquery


    【解决方案1】:

    你可以通过一个简单的 UPDATE 查询来做到这一点

    UPDATE Products
    SET Products.TemplateID = Templates.TemplateID
    FROM Templates
    WHERE Templates.TemplateName = Products.TemplateName
    

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

    【讨论】:

    • 谢谢。没想过做那份工作。不知道为什么。我从未想过在更新语句中使用多个表。
    • 使用连接更安全,然后您可以为更新部分设置别名,并且当有人在执行之前仅突出显示前两行时,永远不会意外地删除所有内容。无论如何您都在进行连接,为什么不具体所以它也便于维护。
    • 如果在执行时只选择了前两行,则会报错,因为在SQL语句中从不'定义'Templates表。 :)
    【解决方案2】:

    这是一个连接解决方​​案。这很重要,因为只有匹配的行会被更新。

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

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

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

    【讨论】:

    • 子查询解决方案对于跨数据库 SQL 生成来说是一个很好的解决方案,因为它在结构上与 Oracle 或 DB2 中的工作方式不同,例如,仅在 2 个地方(在“更新”之后和结尾)。它帮助我今天修复了一个错误。
    【解决方案3】:
    update Templates
    set TemplateId=Products.TemplateId
    from Templates
    inner join Products
       on Templates.TemplateName=Products.TemplateName
    

    【讨论】:

    • 您可以简单地指定 FROM 产品,而不是像我发布的那样在 Products 上指定 FROM 模板。 /)
    • 我认为这只是我习惯于这样做的偏好问题。我不肯定,但我认为执行计划没有任何区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2016-09-10
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多