使用相关 table 中的值更新 table
Update a table with values from a related table
我有两个 table,Users
和 Company
。
我想将值从 Users
table 中的 Active
列转移到 Company
table 中的 Active
列,其中 CompanyID
匹配 ID
。
这是一个例子table。它有数千行,并且 Company
和 Users
之间存在一对一的关系:
Users:
CompanyID Active
458 1
685 1
58 0
Company:
ID Active
5 Null
3 Null
58 Null
685 Null
最终的 Company
table 应该看起来像这样,其中 Null
已替换为 Users
table 中的值。
Company:
ID Active
5 Null
3 Null
58 0
685 1
这应该对你有用。
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
您可以简单地执行 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
语句使用别名 c
和 u
来引用这两个表。
警告:
如评论中所述,这假设您在 Company
和 Users
之间只有一对一的关系。如果有多个用户分配给同一公司,您需要过滤 Users
以选择您要使用的用户,否则您可能会得到意想不到的结果。
假设每家公司有更多用户,我假设 1 个活跃用户会产生一个活跃公司。
UPDATE
Company
SET Active = (SELECT top 1 Active
FROM Users
WHERE CompanyId = Company.id
ORDER BY Active DESC)
UPDATE Company
SET Company.Active = u.Active from Users u
where Company.ID = u.CompanyID
我有两个 table,Users
和 Company
。
我想将值从 Users
table 中的 Active
列转移到 Company
table 中的 Active
列,其中 CompanyID
匹配 ID
。
这是一个例子table。它有数千行,并且 Company
和 Users
之间存在一对一的关系:
Users:
CompanyID Active
458 1
685 1
58 0
Company:
ID Active
5 Null
3 Null
58 Null
685 Null
最终的 Company
table 应该看起来像这样,其中 Null
已替换为 Users
table 中的值。
Company:
ID Active
5 Null
3 Null
58 0
685 1
这应该对你有用。
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
您可以简单地执行 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
语句使用别名 c
和 u
来引用这两个表。
警告:
如评论中所述,这假设您在 Company
和 Users
之间只有一对一的关系。如果有多个用户分配给同一公司,您需要过滤 Users
以选择您要使用的用户,否则您可能会得到意想不到的结果。
假设每家公司有更多用户,我假设 1 个活跃用户会产生一个活跃公司。
UPDATE
Company
SET Active = (SELECT top 1 Active
FROM Users
WHERE CompanyId = Company.id
ORDER BY Active DESC)
UPDATE Company
SET Company.Active = u.Active from Users u
where Company.ID = u.CompanyID