TSQL-生成重复记录的序列号
问题描述:
使用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增加所需的顺序?
答
查询,提取非唯一的记录将
select regno,count(*) from table group by regno having count(*) > 1
我不知道有足够的了解MSSQL告诉你如何生成一个递增的序列号来更新匹配查询的记录。
答
如果我的意见是正确的(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
答
没有一个临时表:
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中,您需要一个临时表来生成序列。
你的意思是INSERT如你所说(从一个现有的新表中),还是真的是一个更新? – RickNZ 2009-11-26 05:36:21
我认为OP意味着更新。这从数据和请求中是有意义的。 – 2009-11-26 05:38:17
RANK是2000年唯一可用的排名函数,我知道这个链接是我能找到的用于生成rowid的最佳排名,但它不会允许您跳过行:http://support.microsoft.com/kb/186133 – 2009-11-26 06:15:36