如何用sql检测错误的序列列?

时间:2012-11-06 12:15:17

标签: sql sql-server

我有这张桌子

ID  |  Seq  
------------
 A      1      
 A      2      
 A      3      
 B      1      
 B      2     
 B      3     
 B      3     <--duplicate seq where ID=B
 C      1     
 C      2
 C      4     <--missing seq id number 3
 D      1
 D      2
 .      .
 .      .

有没有办法检测Seq列逻辑中是否/何时出现错误,特别是有跳转和/或重复时。

3 个答案:

答案 0 :(得分:7)

试试这个:

这应该在sql server和Oracle

中都可以正常工作
select ID,seq
       from(
            select ID,seq,
                   row_number() over (partition by id order by seq ) rn
            from t_seq)a
where a.seq<>a.rn


SQL fiddle demo for SQL server


SQL Fiddle demo for Oracle

答案 1 :(得分:2)

这些都是SQL不可知的,所以应该可以在任何rdbms中使用。

这将检查序列中的中断:

select t1.id, t1.seq
from t_seq t1
where
  t1.seq <> 1
  and not exists (
    select *
     from t_seq t2
    where t2.id = t1.id
      and t2.seq = t1. seq - 1    
)

这将检查重复:

select t1.id, t1.seq
from mytable t1
group by t1.id, t1.se1
having count(*) > 1

答案 2 :(得分:0)

要获取重复项,您可以使用以下T-SQL。

 SELECT ID, Seq FROM MyTable GROUP BY ID, Seq HAVING COUNT(Seq) > 1

修改

为了找出丢失的序列号,我已将njr101提供的代码更新为:

SELECT ID, Seq FROM MyTable t1 WHERE ID IN ( 
    SELECT ID FROM MyTable    
    GROUP BY ID
    HAVING COUNT(DISTINCT Seq) <> MAX(Seq)
) AND t1.seq <> 1 AND NOT EXISTS (
    SELECT * FROM MyTable t2 WHERE t2.id=t1.id AND t2.seq = t1.seq - 1
)
ORDER BY ID

第一个子查询计算该ID的不同行数(忽略重复项)。如果该数字与结果集中包含的最大数量相同,则该ID应该适用于该ID。如果不相等,则结果将在子查询中可用。

第二部分(在njr101的查询的帮助下),将结果集过滤为仅包含应插入缺失值的最后一个ID和seq。结果如下:

My Data
=========
A   1
A   2
A   3
A   20 <--- Missing (displayed in results)
B   1
B   2
B   3
B   3
B   4
C   1
C   2
C   4 <--- Missing (displayed in results)
C   5
C   15 <--- Missing (displayed in results)
C   16

Results
=======
A   20
C   4
C   15