3

我有一个现有表,其中行序号在正常软件操作中增加 100。我需要执行大插入并保持这种增量方法。我以为我会使用 ROW_NUMBER() 但我不知道它是否可以以这种方式增加。

我会感谢您对这个简单主题的帮助,但是,如果您想获得更具体的信息,还请注意,行序列对于项目来说是唯一的,并且一些记录已经开始了该序列。例如

Project  Category  Sequence
Proj1    Cat4      100
Proj1    Cat2      200
Proj2    Cat7      100
Proj2    Cat1      200
Proj3    Cat1      100

因此,如果这些已经存在并且我正在插入新记录,我必须考虑每个项目已经开始的序列。因此,如果我为 Proj1 插入行,则序列值必须为 300、400、...

到目前为止,这是我的代码块:

WITH CTE (PROJECTNUM, COSTCATID, LINE) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
      + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, LINE
FROM CTE;

您可以看到这将产生以 1 递增的记录,而 Proj1 将是 301、302。

非常感谢您的脑力。

更新:我将补充一点,如果在第一次插入行之后可以更容易地在更新语句中完成 100 的增量,那是完全可以接受的。谢谢你。

4

2 回答 2

1

我正在回答我自己的问题,因为在提出问题 5 分钟后,我想到了一个解决方案。我将“SELECT MAX()”部分的使用移至 INSERT 语句,保留行号完整以供以后使用(我需要它用于其他列)。因此,在 INSERT 的 SELECT 部分中,我只需将 ROW * 100 添加到我的 MAX 序列号。

WITH CTE (PROJECTNUM, COSTCATID, ROW) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, (ROW * 100) + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
FROM CTE;
于 2012-12-14T23:47:31.320 回答
1

如果我正确理解您的需求,我相信这将是最简单的一般模式:

SELECT
    ID, RowNumber, ((RowNumber + 99) / 100) * 100
FROM
    (
    SELECT
        ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
    FROM
        Tbl
    ) AS X
于 2012-12-14T23:56:42.333 回答