2009-11-26 53 views
1

使用SQL Server 2000時,請考慮包含超過400,000條記錄的源表。TSQL-生成重複記錄的序列號

任務是選擇每個regno條目,其中包含遞增的實時rowid或具有重複條目或多個條目的那些序列號。對於那些在源表中沒有重複條目的應用,rowid應該簡單地爲null

這裏的期望輸出的一個例子:

 
    regno rowid 
    100  1 
    100  2 
    100  3 
    200  null 
    300  4 
    300  5 
    400  null 
    500  null 
    600  6 
    600  7 

問: 什麼查詢會做在SQL Server 2000中使用T-SQL增加所需的順序?

+0

你的意思是INSERT如你所說(從一個現有的新表中),還是真的是一個更新? – RickNZ 2009-11-26 05:36:21

+1

我認爲OP意味着更新。這從數據和請求中是有意義的。 – 2009-11-26 05:38:17

+0

RANK是2000年唯一可用的排名函數,我知道這個鏈接是我能找到的用於生成rowid的最佳排名,但它不會允許您跳過行:http://support.microsoft.com/kb/186133 – 2009-11-26 06:15:36

回答

0

查詢,提取非唯一的記錄將

select regno,count(*) from table group by regno having count(*) > 1 

我不知道有足夠的瞭解MSSQL告訴你如何生成一個遞增的序列號來更新匹配查詢的記錄。

2

如果我的意見是正確的(600應該是6,7),然後看看這個

DECLARE @Table TABLE(
     regno INT, 
     rowid INT 
) 

INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 200, NULL 
INSERT INTO @Table (regno,rowid) SELECT 300, NULL 
INSERT INTO @Table (regno,rowid) SELECT 300, NULL 
INSERT INTO @Table (regno,rowid) SELECT 400, NULL 
INSERT INTO @Table (regno,rowid) SELECT 500, NULL 
INSERT INTO @Table (regno,rowid) SELECT 600, NULL 
INSERT INTO @Table (regno,rowid) SELECT 600, NULL 

DECLARE @TempTable TABLE(
     ID INT IDENTITY(1,1), 
     regno INT 
) 

INSERT INTO @TempTable (regno) 
SELECT regno 
FROM @Table 

SELECT regno, 
     CASE 
      WHEN (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno) = 1 
       THEN NULL 
      ELSE (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno) - (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno AND ID > t.ID) + 
      (SELECT COUNT(1) FROM @TempTable WHERE regno < t.regno AND regno IN (SELECT regno FROM @TempTable GROUP BY regno having COUNT(1) > 1)) 
     END Val  
FROM @TempTable t 
0

沒有一個臨時表:

DECLARE @Table TABLE(
     regno INT 
) 

INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 200 
INSERT INTO @Table (regno) SELECT 300 
INSERT INTO @Table (regno) SELECT 300 
INSERT INTO @Table (regno) SELECT 400 
INSERT INTO @Table (regno) SELECT 500 
INSERT INTO @Table (regno) SELECT 600 
INSERT INTO @Table (regno) SELECT 600 

select regno, null as rowid from @Table group by regno having count(*) = 1 
union 
select regno, row_number() OVER (ORDER BY a.regno) as rowid 
    from @table a 
    where regno in (select regno from @table group by regno having count(*) > 1) 

regno  rowid 
----------- -------------------- 
100   1 
100   2 
100   3 
200   NULL 
300   4 
300   5 
400   NULL 
500   NULL 
600   6 
600   7 

哎呀 - 沒有看到,你想在SQL 2000中執行此操作,直到發佈後...請忽略我的查詢。在SQL 2000中,您需要一個臨時表來生成序列。