2017-02-23 4 views
0

SQL Serverプロジェクトで作業する場合、データインポートの要件の1つとして、すべてのタグが正しい順序であることを検証することがあります.Tageがないことを心配していません。私が探しているのは、データがインポートされた順番(キー)に基づいて順序が外れているため '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

あなたは、あなたが次/前の行のキー値を見てLEAD()またはLAG()を使用することができますSQL Server 2012の以降を使用している場合。 (シーケンスは、キー= 1から始まり、1ずつ増加している場合)

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の両方から信じては、シーケンス外です。

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 
関連する問題