2012-12-14 62 views
3

我有一個現有的表,其中在正常的軟件操作中,行序列號增加100。我需要執行一個大插入並保持這種增量方法。我以爲我會使用ROW_NUMBER(),但我不知道它是否可以用這種方式增加。使用ROW_NUMBER增加100?

但是,如果您想要獲得更具體的內容,請注意行項順序對於項目是唯一的,並且一些記錄已經開始了順序。例如

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; 

你可以看到這將產生記錄由一個遞增對於Proj1將是301,302。

您的大腦力量非常感謝。

更新:我會補充一點,如果在第一次插入行之後,更新語句中的這個增量可以更容易地完成,那麼這是完全可以接受的。謝謝。

回答

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; 
1

如果我正確理解你的需求,我相信這是最簡單的一般模式:

SELECT 
    ID, RowNumber, ((RowNumber + 99)/100) * 100 
FROM 
    (
    SELECT 
     ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber 
    FROM 
     Tbl 
    ) AS X 
+0

'((ROWNUMBER + 99)/ 100)* 100'? 你可以'SELECT ID,ROW_NUMBER()OVER(ORDER BY ID)* 100 AS RowNumber' –