如何在不使用连接或合并的情况下用另一个 table 更新 table 的属性
How to update an attribute of a table with another table withouth using join or merge
我有一个名为 "customerInfo" 的临时 table,如下所示:
|CustomerNumber |
|197210271883 |
|197210271883 |
|194905062891 |
|194905301380 |
另一个 table 称为 "Person",如下所示:
|Id CustomerNumber FirstName LastName |
|1 NULL Jack Axelsson |
|2 198003147470 Sarah Flöijer |
|3 196305088491 Göte Lagergren |
我需要根据什么在第二个 table 中更新 CustomerNumber
我在第一个。如您所见,它们之间没有关系,我无法利用连接或合并技术。
我尝试的是使用两个游标。我完全不知道这样对不对?
DECLARE @value1 bigint
DECLARE db_cursor CURSOR FOR
SELECT CustomerNumber from customerInfo;
DECLARE @value2 bigint
DECLARE db_cursor_2 CURSOR FOR
SELECT CustomerNumber from Person;
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @value1
OPEN db_cursor_2
FETCH NEXT FROM db_cursor_2 INTO @value2
WHILE @@FETCH_STATUS = 0
BEGIN
update Person set CustomerNumber = @value1
where CustomerNumber = @value2
FETCH NEXT FROM db_cursor INTO @value1
FETCH NEXT FROM db_cursor_2 INTO @value2
END
CLOSE db_cursor
DEALLOCATE db_cursor
CLOSE db_cursor_2
DEALLOCATE db_cursor_2
如果我没理解错的话,您想在第二个 table 中超越 CustomerNumber 的现有值?
要做到这一点,游标不是最好的主意,因为它们是按顺序工作的。也许尝试这样的事情:
; WITH CTE1 AS (
SELECT CustomerNumber, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO
FROM customerInfo
), CTE2 AS (
SELECT Id, CustomerNumber, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO
FROM Person
)
UPDATE CTE2
SET CTE2.CustomerNumber = CTE1.CustomerNumber
FROM CTE1
INNER JOIN CTE2 ON CTE1.SNO = CTE2.SNO
这尚未在 SQL 服务器中进行测试,因此可能存在一些错误,但您可以从上面的代码中理解这一点。
我有一个名为 "customerInfo" 的临时 table,如下所示:
|CustomerNumber |
|197210271883 |
|197210271883 |
|194905062891 |
|194905301380 |
另一个 table 称为 "Person",如下所示:
|Id CustomerNumber FirstName LastName |
|1 NULL Jack Axelsson |
|2 198003147470 Sarah Flöijer |
|3 196305088491 Göte Lagergren |
我需要根据什么在第二个 table 中更新 CustomerNumber 我在第一个。如您所见,它们之间没有关系,我无法利用连接或合并技术。
我尝试的是使用两个游标。我完全不知道这样对不对?
DECLARE @value1 bigint
DECLARE db_cursor CURSOR FOR
SELECT CustomerNumber from customerInfo;
DECLARE @value2 bigint
DECLARE db_cursor_2 CURSOR FOR
SELECT CustomerNumber from Person;
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @value1
OPEN db_cursor_2
FETCH NEXT FROM db_cursor_2 INTO @value2
WHILE @@FETCH_STATUS = 0
BEGIN
update Person set CustomerNumber = @value1
where CustomerNumber = @value2
FETCH NEXT FROM db_cursor INTO @value1
FETCH NEXT FROM db_cursor_2 INTO @value2
END
CLOSE db_cursor
DEALLOCATE db_cursor
CLOSE db_cursor_2
DEALLOCATE db_cursor_2
如果我没理解错的话,您想在第二个 table 中超越 CustomerNumber 的现有值?
要做到这一点,游标不是最好的主意,因为它们是按顺序工作的。也许尝试这样的事情:
; WITH CTE1 AS (
SELECT CustomerNumber, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO
FROM customerInfo
), CTE2 AS (
SELECT Id, CustomerNumber, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO
FROM Person
)
UPDATE CTE2
SET CTE2.CustomerNumber = CTE1.CustomerNumber
FROM CTE1
INNER JOIN CTE2 ON CTE1.SNO = CTE2.SNO
这尚未在 SQL 服务器中进行测试,因此可能存在一些错误,但您可以从上面的代码中理解这一点。