2013-03-19 102 views
1

我在T-SQL此列:查找列缺号

1 
2 
3 
7 
10 

有SQL中为序列4,5,6和8,9 我有尝试检测丢失号码的功能 类似 如果(ab> 1)那么我们有一个缺少的号码

与coalesce但我不明白。 感谢任何方向

+0

这将有助于如果您发布的功能... – 2013-03-19 14:58:22

+0

如果您有这样的功能,您的问题是什么? – 2013-03-19 15:27:03

+0

@GordonLinoff“有SQL函数...”可能意思是“有SQL函数...?”尽管这当然只是一个有教养的猜测 – Pondlife 2013-03-19 17:10:05

回答

3

你可以试试这个:

DELCARE @a 
SET @a = SELECT MIN(number) FROM table 
WHILE (SELECT MAX(number) FROM table) > @a 
BEGIN 
IF @a NOT IN (SELECT number FROM table) 
PRINT @a 
SET @[email protected]+1 
END 
+0

#winces#尽管这可能起作用,但SQL最适合在'sets'中工作;基本上,没有迭代器/循环。循环的某些应用可能会带来更好的性能,但它几乎总是会被基于集合的方法所打败。 – 2013-03-19 16:12:43

+0

@ Clockwork-Muse OK集合通常比光标快。请针对所述问题提出一套基于解决方案。 – Paparazzi 2013-03-19 16:20:05

1

下面的查询将找出每个序列开始和数量缺失:

select t.col + 1 as MissingStart, (nextval - col - 1) as MissingSequenceLength 
from (select t.col, 
      (select min(t.col) from t t2 where t2.col > t.col) as nextval 
     from t 
    ) t 
where nextval - col > 1 

这是通过使用相关子查询获取表格中的下一个值。

1

我知道这是一个迟到的回答,但这里是一个使用递归表表达式得到一个表中的最小值和最大值之间的遗漏值的查询:

WITH CTE AS 
(
    --This is called once to get the minimum and maximum values 
    SELECT nMin = MIN(t.ID), MAX(t.ID) as 'nMax' 
    FROM Test t 
    UNION ALL 
    --This is called multiple times until the condition is met 
    SELECT nMin + 1, nMax 
    FROM CTE 
    WHERE nMin < nMax 
) 

--Retrieves all the missing values in the table. 
SELECT c.nMin 
FROM CTE c 
WHERE NOT EXISTS 
(
    SELECT ID 
    FROM Test 
    WHERE c.nMin = ID 
) 

这是用下面的测试模式:

CREATE TABLE Test 
(
    ID int NOT NULL 
) 

INSERT INTO Test 
    Values(1) 

INSERT INTO Test 
    Values(2) 

INSERT INTO Test 
    Values(3) 

INSERT INTO Test 
    Values(7) 

INSERT INTO Test 
    Values(10)