2017-02-23 99 views
0

處理SQL Server項目時,作爲數據導入一部分的要求之一是驗證所有標記的順序是否正確,並且我並不擔心缺少tages。根據數據導入的順序(鍵),我所尋找的應該返回'7010',因爲它是無序的。我知道如何使用其他語言在外部執行此操作,但導入的大小使得這是一個緩慢的過程,並希望找到一種本機SQL方法。如何檢查數字是否無序?

key tag 
    1 7001 
    2 7002 
    3 7004 
    4 7010 
    5 7005 
    6 7006 
+3

您正在使用什麼版本的SQL Server? –

+0

您能夠顯示您嘗試執行命令的代碼嗎? –

+0

SQL Server 2015 –

回答

0

如果您正在使用SQL Server 2012或更高版本,那麼你可以使用LEAD()LAG()看下一/前一列的鍵值。

SELECT [key] 
    , tag 
FROM 
(SELECT 
    [key], 
    tag, 
    LEAD(tag) OVER (ORDER BY [key]) next_tag, 
    LAG(tag) OVER (ORDER BY [key]) prev_tag 
FROM myTable) r 
WHERE (tag + 1 <> next_tag AND tag - 1 <> prev_tag) 

另外,我從例如兩個7004和7010是失序的信(如果該序列起始於鍵= 1和遞增1)。

如果您使用的是SQL Server 2008R2/2005等,那麼您可以使用雙自連接來獲得相同的結果。

SELECT t.* 
FROM myTable t 
    LEFT JOIN myTable tprev on t.[key] = tprev.[key] + 1 
    LEFT JOIN myTable tnext on t.[key] = tnext.[key] - 1 
WHERE tprev.tag + 1 <> t.tag 
    AND tnext.tag - 1 <> t.tag 
+0

需要按鑰匙訂購 – ajeh

+0

@ajeh我不知道我明白你在說什麼。我有它按鍵排序。 –

+0

謝謝。只要存在的標籤的順序正確,丟失的標籤就可以。 –

0

這是您的需求嗎?

DECLARE @tb TABLE([KEY] int,tag INT) 
    INSERT INTO @tb ([KEY], tag) 
    VALUES (1,7001),(2,7002),(3,7004),(4,7010),(5,7005),(6,7006) 
    SELECT * FROM (
     SELECT *,LEAD(tag)OVER(ORDER BY [key]) AS n FROM @tb 
    ) AS t 
    WHERE t.tag>t.n 
 
KEY   tag   n 
----------- ----------- ----------- 
4   7010  7005