【问题标题】:Update a column in a table by joining multiple tables通过连接多个表来更新表中的列
【发布时间】:2018-11-17 14:16:13
【问题描述】:

我有一张表user我需要更新,

user 表包含branchIdaccountNamebranchId 是表 branch 上的 fk 引用,其中包含 institutionIdInstitutionId 是对 institution 表的 FK 引用。机构表包含nameid

我想将user 表中的accountName 更新为该用户的等效机构名称。

我目前拥有的是

update [user] set accountName = 
(Select i.NAME from institution i LEFT JOIN [branch] b on b.institution_id = i.id and b.id = branchId) 

但我得到了

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一种表达。声明已终止。

我正在使用mssql

我不是使用 sql 的专业人士。任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 嗯....错误很明显。您的子查询返回超过 1 行,因此它不知道要使用哪个值。你需要一些东西来匹配用户。可能像一个机构 ID。
  • 是的,这就是我这样做的原因,b.id = branchId, branchId 来自user
  • 查看此 URL 寻求帮助 stackoverflow.com/questions/1604091/…
  • 我的问题是为什么?用户将简单地复制机构。相反,如果用户也有个人用户名/ id,那么添加机构 id 是有意义的,那么要获取机构的名称,您只需要 select u.name, i.name from user u, authority i where u.institution = i.id。这可以防止数据重复。这可能会导致问题。
  • @Danimal 表结构比你想象的要复杂。我只是缩小了提问的范围

标签: sql sql-server database sql-server-2008


【解决方案1】:

您需要将目标表与源表连接起来。首先创建一个SELECT 查询

Select i.NAME, u.accountName
from institution i 
JOIN [user] u
on {set suitable criteria}
LEFT JOIN [branch] b on b.institution_id = i.id and b.id = branchId

并检查这是否返回了正确的结果。将SELECT 替换为UPDATE 如下:

update u set accountName = i.NAME
from institution i 
JOIN [user] u
on {set suitable criteria}
LEFT JOIN [branch] b on b.institution_id = i.id and b.id = branchId

【讨论】:

    【解决方案2】:

    试试这个:

    UPDATE u
    SET u.accountName = i.name
    FROM User u
    JOIN Branch b ON b.id = u.branchId
    JOIN Institution i ON i.id = b.institutionId
    

    【讨论】:

    • 非常非常贴切!。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2014-07-23
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多