首页 新闻 搜索 专区 学院

sql 查询缺少的行号

0
悬赏园豆:20 [已解决问题] 解决于 2012-08-15 13:40

我现在数据库里有一张表,这张表中每行都有一个行号的字段,但这张表数据不全,我想查出所缺少行的行号,假设最大行号是10000,请问应该怎样些这个查询

hlyue88的主页 hlyue88 | 初学一级 | 园豆:174
提问于:2011-11-05 01:37
< >
分享
最佳答案
1

如果一个值加1后不位于同一个表中,那么这个值正好位于一个间断的前面

假设有表 numseq  ,表中只有一列seqval int 自增(缺失列)

SQL:

select
* from numseq A WHERE
NOT EXISTS (SELECT * FROM numseq B WHERE B.seqval = A.seqval+1)

 

可查询出所有间断,如果第一个间断是1,要处理一下

收获园豆:20
哇~怪兽 | 小虾三级 |园豆:610 | 2011-11-10 16:44
其他回答(3)
0

你的行号是连续的吗?就是从1开始一直到10000吗?如果是的话可以建个临时表,插入1到10000的数,然后两个表连接查询下就知道不存在的行号是哪些了。

webaspx | 园豆:1987 (小虾三级) | 2011-11-05 09:06
0
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

思路就是一个循环找出所有的缺失行号插入一个表变量。

编辑器加载中...

Life a Poem | 园豆:437 (菜鸟二级) | 2011-11-05 10:39

这样应该是可以的,不过我的表中的数据有近千万条,这样查起来非常耗时啊,还是很感谢啊

支持(0) 反对(0) hlyue88 | 园豆:174 (初学一级) | 2011-11-07 16:13
0

先创建一个临时表,只有一个字段就是1~10000的数据,将这个表与你的数据左连接,再where 行号为空的就可以了

小小刀 | 园豆:1991 (小虾三级) | 2011-11-07 22:36

要是你要考虑性能,可以考虑在临时表里面加索引即可

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-11-07 22:37

“先创建一个临时表,只有一个字段就是1~10000的数据”——你是说创建一个临时表,然后循环插入1~10000吗?这个过程可相当耗时啊!我插入1~1000就用时两分多,要是千万的数据不可想象啊

支持(0) 反对(0) hlyue88 | 园豆:174 (初学一级) | 2011-11-10 14:19

@hlyue88: 也可以建一个实体表,只有一个字段。另外插入1000条要两分钟?你是什么数据库,什么配置的机器?

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-11-10 19:12

@小小刀: 太难了吧.要2分钟? 1万条也就1秒搞定啊.

支持(0) 反对(0) dearz | 园豆:588 (小虾三级) | 2011-12-29 10:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册