具有连接行值的 UPDATE 语句
UPDATE Statement with concatenate row values
数据库 table 具有 Column1 和 Column2。获取值并映射列(Column1 和 Column2)详细信息并在 Column3
中更新
Column3 应具有 Column1 值,其中 Column1 值等于 Column2 值。请参考附图以便更好地理解。
示例 1:Column1 包含 914702(Row#2),Column2(Row#1)中有相同的值。因此,第 2 行的 Column3 应该更新第 1 行中第 1 列的值,即 914703
示例 2:Column1 包含 914698(Row#5),Column2(Row#3 & 4)中有相同的值。因此,第 5 行中的 Column3 应包含第 3 行和第 4 行中的 Column1 的值,即 914700、914701。
可以通过下面提到的查询和 WHILE 循环来实现。
table 有 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, 0, LEN(@Variable) - 1)
WHERE Column1 = @Value
预期输出
该脚本应该适合您:
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
数据库 table 具有 Column1 和 Column2。获取值并映射列(Column1 和 Column2)详细信息并在 Column3
中更新Column3 应具有 Column1 值,其中 Column1 值等于 Column2 值。请参考附图以便更好地理解。
示例 1:Column1 包含 914702(Row#2),Column2(Row#1)中有相同的值。因此,第 2 行的 Column3 应该更新第 1 行中第 1 列的值,即 914703
示例 2:Column1 包含 914698(Row#5),Column2(Row#3 & 4)中有相同的值。因此,第 5 行中的 Column3 应包含第 3 行和第 4 行中的 Column1 的值,即 914700、914701。
可以通过下面提到的查询和 WHILE 循环来实现。
table 有 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, 0, LEN(@Variable) - 1)
WHERE Column1 = @Value
预期输出
该脚本应该适合您:
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