繁体   English   中英

更新表列以填充缺少的序列号

[英]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.

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