我有一张桌子,例如
cust_ord_key
1
2
3
4
5
7
9
如何编写查询以查明数字是否按顺序排列并且不会破坏任何地方?
答案 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或其他任何地方使用它,您可以从结果集中删除最后一行。