找到标识列中断的列

时间:2016-01-08 01:37:49

标签: sql

我有一张桌子,例如

cust_ord_key 
1
2
3
4
5
7
9

如何编写查询以查明数字是否按顺序排列并且不会破坏任何地方?

3 个答案:

答案 0 :(得分:0)

在SQL Server中:

SELECT SeqID AS MissingSeqID
FROM (SELECT ROW_NUMBER() OVER (ORDER BY column_id) SeqID from sys.columns) LkUp
LEFT JOIN dbo.TestData t ON t.ID = LkUp.SeqID

答案 1 :(得分:0)

您可以执行以下操作:

DECLARE @RESULT int;
SET @RESULT = 0;
DECLARE @FIRST_ID int;
DECLARE @LAST_ID int;
DECLARE @THIS_VALUE int;
DECLARE @NEXT_VALUE int;
SELECT @FIRST_ID = min(ID), @LAST_ID = max(ID) from table_name;

WHILE(@FIRST_ID <= @LAST_ID)
    BEGIN
        SELECT @THIS_VALUE = your_field_with_keys from table_name where ID = @FIRST_ID;
        SELECT @NEXT_VALUE = your_field_with_keys from table_name where ID = (@FIRST_ID + 1);
        if @THIS_VALUE > @NEXT_VALUE
            SET @RESULT = @FIRST_ID;
            --break your query here or do anything else
        SET @FIRST_ID = @FIRST_ID + 1;
    END

这个查询有什么作用?我们声明@RESULT变量用于获取密钥的ID,其中密钥是破坏的。 @FIRST_ID和@LAST_ID是表中的最小和最大ID,稍后我们将使用它们。 @THIS_VALUE和@NEXT_VALUE是两个要比较的键的变量。

然后我们对我们的ID执行循环。然后使用相应的键(此和下一个)设置@THIS_VALUE和@NEXT_VALUE。如果@THIS_VALUE超过@NEXT_VALUE,则意味着密钥在此处中断(如果上一个密钥超过下一个密钥),并且我们获取元素的ID,其中密钥被破坏。在那里你可以停止查询或做一些必要的逻辑。

答案 2 :(得分:0)

这并不完美,但绝对可以胜任,并且在所有数据库引擎中都是通用的。

SELECT t1.id FROM myTable t1
LEFT JOIN myTable t2 ON t1.id+1 = t2.id
WHERE t2.id IS NULL

当身份没有破坏时,这只会返回最后一个条目。您可以使用过程语言对此进行补偿,首先将MAX(ID)添加到WHERE子句中,如下所示:

WHERE t2.id IS NULL AND t1.id<>5643

其中5643是最大id(在查询字符串中引入的变量,或者可以是您正在使用的任何数据库引擎的过程SQL语言中的变量)。关键是它是该表上标识的最大值。

或者,如果您在PHP或其他任何地方使用它,您可以从结果集中删除最后一行。