使用相关表中的值更新表

时间:2015-03-25 13:56:39

标签: sql sql-server conditional-statements transfer

我有两个表,UsersCompany

我想将Active表格中Users列的值转移到Active表格中的Company列,其中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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您只需执行在UPDATE之间使用JOIN的{​​{1}},如下所示:

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来引用这两个表。

<强>警告:

如评论中所述,这假设您在CompanyUsers之间只有一对一的关系。如果为同一公司分配了多个用户,则需要过滤Users以选择要使用的用户,否则可能会出现意外结果。

答案 2 :(得分:1)

假设每个公司有更多用户,我认为1个活跃用户会产生一个活跃的公司。

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

答案 3 :(得分:0)

UPDATE Company
SET Company.Active = u.Active from Users u
where Company.ID = u.CompanyID