简体   繁体   中英

UPDATE Statement with concatenate row values

The database table having Column1 and Column2 . Fetch the values and map the column (Column1 and Column2) details and update in Column3

Column3 should have Column1 value where the Column1 value is equal to Column2 value. Please refer the attached image for better understanding.

Example1: Column1 holds 914702(Row#2) the same value is available in Column2(Row#1). So the Column3 for Row#2 should update the value of Column1 in Row#1 which is 914703

Example2: Column1 holds 914698(Row#5) the same value is available in Column2(Row#3 & 4). So the Column3 in Row#5 should holds the values of Column1 in Row#3 & 4 which is 914700, 914701.

Able to achieve this with below mentioned query and WHILE loop.

The table having 100s of Rows. Using while loop will impact the performance. Will we able to achieve this with UPDATE statement in SQL Server.

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

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

Expected Output

在此处输入图像描述

That script should work for you:

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, Null),
(914700,914698, Null),
(914701,914698, Null),
(914698,Null, Null),
(914570,Null, Null),
(914569,Null, Null),
(914568,Null, Null),
(914565,914564, Null),
(914564,Null, Null),
(914546,Null, Null),
(914545,Null, Null),
(914425,Null, 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM