【问题标题】:Update a table with values from a related table使用相关表中的值更新表
【发布时间】:2015-03-25 13:56:38
【问题描述】:

我有两张桌子,UsersCompany

我想将值从Users 表中的Active 列传输到Company 表中的Active 列,其中CompanyID 匹配ID

这是一个示例表。它有数千行,CompanyUsers 之间存在一对一的关系:

Users:
CompanyID    Active
458          1
685          1
58           0

Company:
ID           Active
5            Null
3            Null
58           Null
685          Null

最终的Company 表应如下所示,其中Null 已替换为Users 表中的值。

Company:
ID           Active
5            Null
3            Null
58           0
685          1

【问题讨论】:

  • 这里是否同时使用了 MySQL 和 MS SQL Server? (不要标记未涉及的产品...)
  • 对不起,只是 SQL 服务器
  • 你试过什么?当一家公司有超过 1 个用户时怎么办?
  • 基本加入这里。非常非常基本:)
  • 基本合并也加入

标签: sql sql-server conditional-statements transfer


【解决方案1】:

您可以简单地执行UPDATE,在两个表之间使用JOIN,如下所示:

UPDATE c
SET Active = u.Active
FROM Company c
INNER JOIN Users u ON u.CompanyId = c.ID

完整的工作示例代码:

CREATE TABLE #Users
    (
      CompanyId INT ,
      Active BIT
    )

INSERT  INTO #Users
        ( CompanyId, Active )
VALUES  ( 458, 1 ),
        ( 685, 1 ),
        ( 58, 0 )

CREATE TABLE #Company
    (
      ID INT ,
      Active BIT
    )

INSERT  INTO #Company
        ( ID, Active )
VALUES  ( 5, NULL ),
         ( 3, NULL ),
         ( 58, NULL ),
         ( 685, NULL )

UPDATE c
SET Active = u.Active
FROM #Company c
INNER JOIN #Users u ON u.CompanyId = c.ID

SELECT * FROM #Company

DROP TABLE #Users
DROP TABLE #Company 

您会注意到示例代码中的UPDATE 语句使用别名cu 来引用这两个表。

警告:

正如 cmets 中所述,这假设您在 CompanyUsers 之间只有一对一的关系。如果有多个用户分配给同一家公司,您需要过滤Users 以选择您要使用的用户,否则您可能会得到意想不到的结果。

【讨论】:

  • 如果公司有超过 1 个用户,您将无法控制最终结果是哪个活动代码
  • @t-clausen.dk OP 更新问题以说明存在 1-1 关系
  • @t-clausen.dk 我正在处理一个单独的查询以涵盖该案例,但在更新问题后将其分箱
【解决方案2】:

这应该对你有用。

DECLARE @Users TABLE (CompanyID INT, Active BIT);
DECLARE @Companies TABLE (CompanyID INT, Active BIT);

INSERT INTO @Users (CompanyID, Active)
VALUES (458, 1), (685, 1), (58, 0)

INSERT INTO @Companies (CompanyID)
VALUES (5),(3),(58),(685)


SELECT C.CompanyID, U.Active
FROM @Companies AS C
OUTER APPLY (
    SELECT TOP (1) U.Active
    FROM @Users AS U
    WHERE U.CompanyID = C.CompanyID
    ORDER BY U.Active DESC
    ) AS U(Active)

结果:

CompanyID   Active
------------------
5           NULL
3           NULL
58          0
685         1

【讨论】:

    【解决方案3】:

    假设每个公司都有更多用户,我会假设 1 个活跃用户会导致活跃公司。

    UPDATE
      Company
    SET Active = (SELECT top 1 Active
                  FROM Users 
                  WHERE CompanyId = Company.id
                  ORDER BY Active DESC)
    

    【讨论】:

      【解决方案4】:
      UPDATE Company
      SET Company.Active = u.Active from Users u
      where Company.ID = u.CompanyID
      

      【讨论】:

      • 为了将来参考,通常最好在答案中添加某种解释,否则它会自动提交审核,仅作为代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多