我现在数据库里有一张表,这张表中每行都有一个行号的字段,但这张表数据不全,我想查出所缺少行的行号,假设最大行号是10000,请问应该怎样些这个查询
如果一个值加1后不位于同一个表中,那么这个值正好位于一个间断的前面
假设有表 numseq ,表中只有一列seqval int 自增(缺失列)
SQL:
select
* from numseq A WHERE
NOT EXISTS (SELECT * FROM numseq B WHERE B.seqval = A.seqval+1)
可查询出所有间断,如果第一个间断是1,要处理一下
你的行号是连续的吗?就是从1开始一直到10000吗?如果是的话可以建个临时表,插入1到10000的数,然后两个表连接查询下就知道不存在的行号是哪些了。
DECLARE @missingLine TABLE
(
LineNum int
)
DECLARE @minNum int
DECLARE @maxNum int
SELECT @minNum = MIN(LineNum) FROM tblLine --use 1 instead of MIN(LineNum) if you want to start from 1
SELECT @maxNum = MAX(LineNum) FROM tblLine
WHILE @minNum < @maxNum
BEGIN
IF NOT EXISTS (SELECT * FROM tblLine WHERE LineNum = @minNum)
INSERT INTO @missingLine(LineNum) VALUES(@minNum)
SET @minNum = @minNum + 1
END
SELECT * FROM @missingLine
思路就是一个循环找出所有的缺失行号插入一个表变量。
编辑器加载中...
这样应该是可以的,不过我的表中的数据有近千万条,这样查起来非常耗时啊,还是很感谢啊
先创建一个临时表,只有一个字段就是1~10000的数据,将这个表与你的数据左连接,再where 行号为空的就可以了
要是你要考虑性能,可以考虑在临时表里面加索引即可
“先创建一个临时表,只有一个字段就是1~10000的数据”——你是说创建一个临时表,然后循环插入1~10000吗?这个过程可相当耗时啊!我插入1~1000就用时两分多,要是千万的数据不可想象啊
@hlyue88: 也可以建一个实体表,只有一个字段。另外插入1000条要两分钟?你是什么数据库,什么配置的机器?
@小小刀: 太难了吧.要2分钟? 1万条也就1秒搞定啊.