带有连接行值的 UPDATE 语句

问题描述

具有Column1Column2数据库表。获取值并映射列(Column1 和 Column2)详细信息并在 Column3

中更新

Column3 应具有 Column1 值,其中 Column1 值等于 Column2 值。请参考附图以便更好地理解。

示例 1:Column1 包含 914702(Row#2) Column2(Row#1) 中可用的相同值。所以 Row#2 的 Column3 应该更新 Row#1 中 Column1 的值,即 914703

示例 2:列 1 保存 914698(行#5),列 2(行#3 和 4)中可用的值相同。因此,第 5 行中的 Column3 应保存第 3 行和第 4 行中 Column1 的值,即 914700、914701。

能够通过下面提到的查询和 WHILE 循环来实现这一点。

有 100 行的表格。使用while循环会影响性能。我们能否通过 sql Server 中的 UPDATE 语句实现这一点。

DECLARE @Variable VARCHAR(MAX) = ''
SELECT @Variable = @Variable + 'Value: ' + CONVERT(VARCHAR,Column1) + ',' 
FROM Table1 WHERE Column2 = @Value

UPDATE Table1
SET Column3 = SUBSTRING(@Variable,LEN(@Variable) - 1)
WHERE Column1 = @Value

预期输出

enter image description here

解决方法

该脚本应该适合您:

use tempdb;
GO
DROP TABLE IF EXISTS Table1;
GO
CREATE TABLE Table1 (
    Column1 INT NOT NULL,Column2 INT NULL,Column3 VARCHAR(MAX) NULL
);
GO
INSERT INTO Table1 VALUES 
(914703,914702,Null),(914702,Null,(914700,914698,(914701,(914698,(914570,(914569,(914568,(914565,914564,(914564,(914546,(914545,(914425,Null);
GO
UPDATE te 
SET Column3 = IIF(Column3_n IS NULL,NULL,LEFT(Column3_n,LEN(Column3_n)-1))
FROM Table1 as te
OUTER APPLY (
    SELECT 'Value: ' + CAST(t2.Column1 as VARCHAR(MAX)) + ','
    FROM Table1 as t1
    INNER JOIN Table1 as t2 
        ON t1.Column1 = t2.Column2
    WHERE t1.Column1 = te.Column1
    FOR XML PATH('')
) as ta(Column3_n);
GO
SELECT * FROM Table1 ORDER BY Column1 DESC;
GO