[英]Update Table Column to Fill Missing Sequence No
我有一张桌子有以下数据
CategoryID Name Sequence
10 One 1
10 Two 2
10 Three 4
20 One 1
20 Two 3
20 Three 4
30 One 1
30 Two 2
30 Three 3
现在,我要更新类别ID为10和20的表,以便更正序列,并且最终结果如下。
CategoryID Name Sequence
10 One 1
10 Two 2
10 Three 3
20 One 1
20 Two 2
20 Three 3
30 One 1
30 Two 2
30 Three 3
我正在尝试使用公用表表达式,但无法执行。 知道如何完成这项任务吗?
我不想一一更新每一行。 我想创建一个通用的解决方案。 因此,在要更新的记录集很大的情况下,它可以用同一段代码处理,而不是复制粘贴和更改每一行的值。
注意:出于理解目的,“名称”列中的值是虚构的。 可以是任何东西。 例如美国的乔等
要使序列号保持无间隙是非常困难的。 您将拥有插入/更新/删除触发器来保证这一点。
但是,这并不是真正需要的,因为您始终可以使用分析函数ROW_NUMBER即时获得无缝的行号:
select
categoryid,
name,
sequence,
row_number() over (partition by categoryid order by sequence)
from my table
order by categoryid, sequence;
UPDATE t
SET Sequence = RN
FROM
(
SELECT Sequence, ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY CategoryID)
AS RN FROM Table_1
) t
对于特定类别ID
UPDATE t
SET Sequence = RN
FROM
(
SELECT Sequence, ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY CategoryID) AS RN
FROM Table_1
WHERE CategoryID = 10
) t
原始价值
输出量
我不确定我是否理解正确,但是您不能这样做:
Update table set sequence = 1 where Name = 'one';
Update table set sequence = 2 where Name = 'two';
Update table set sequence = 3 where Name = 'three';
还是我错过了什么?
我提出了以下代码来创建通用解决方案。 我已经完成了单元测试。 但是,可能存在极端情况。 不过,它为我完成了工作。
IF OBJECT_ID('tempdb..#MY_TEMP_TABLE') IS NOT NULL
DROP TABLE #MY_TEMP_TABLE
CREATE table #MY_TEMP_TABLE(
CategoryID INT,
[Custom_Index] INT)
DECLARE @Index INT = 0 --
DECLARE @TotalParams INT = 0 --
DECLARE @Name VARCHAR(100)
INSERT INTO #MY_TEMP_TABLE
SELECT CategoryID, RANK() OVER (ORDER BY [Sequence]) AS [Custom_Index]
FROM MY_ACTUAL_TABLE
WHERE CategoryID = 20
WHILE @Index < @TotalParams
BEGIN
SET @Index = @Index + 1
SELECT @Name = [Name]
FROM #MY_TEMP_TABLE
WHERE #MY_TEMP_TABLE.[Custom_Index] = @Index
UPDATE
MY_ACTUAL_TABLE
SET [Sequence] = @Index
WHERE CategoryID = 20 AND [Name] = @Name
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.