2017-01-13 26 views
3

SQLテーブルにないインデックス値のリストを生成するクエリを生成したいと思います。これまでのところ、私が持っているものテーブル内に見つからない数字を見つける

SELECT index - 1 
FROM table 
WHERE index - 1 NOT IN (
    SELECT DISTINCT index 
    FROM table) 
    AND 
    index != 1; 

はこれが唯一欠けているインデックスのシーケンスの最初不足しているインデックスを見つけています。私は1からMAX(index)の間のすべての数を出力するクエリを生成したいと思います。これはテーブルにindexとして表示されません。それを行う方法はありますか?あなたが不足しているインデックスを見つけるために、数字テーブルを必要とする

答えて

4

Recursive CTEアプローチの番号を生成するために、集計テーブルを使用して

DECLARE @max_num INT = (SELECT Max(index) 
    FROM table); 

WITH cte 
    AS (SELECT 1 AS num 
     UNION ALL 
     SELECT num + 1 
     FROM cte 
     WHERE num < @max_num) 
SELECT * 
FROM cte c 
WHERE NOT EXISTS (SELECT 1 
        FROM table t 
        WHERE c.num = t.index) 
ORDER BY c.num 
OPTION (maxrecursion 0) 

別のアプローチを値。

;WITH E1(N) 
    AS (SELECT * 
     FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) tc (N)), --10E+1 or 10 rows 
    E2(N) 
    AS (SELECT 1 FROM E1 a CROSS JOIN E1 b), --10E+2 or 100 rows 
    E4(N) 
    AS (SELECT 1 FROM E2 a CROSS JOIN E2 b), --10E+4 or 10,000 rows max 
    --E5(N) AS (SELECT 1 FROM E4 a CROSS JOIN E1 b), -- 10000 * 10 = 100000 
    cte(NUM) 
    AS (SELECT ItemNumber = Row_number()OVER(ORDER BY N) FROM E4) 
SELECT * 
FROM cte c 
WHERE NOT EXISTS (SELECT 1 
        FROM table t 
        WHERE c.num = t.index) 
ORDER BY c.num 

現在は10000、順次行番号を生成し、AN、あなたの最大値が10000を超えるであるならば、あなたは、クエリのこのタイプのための私の好みは範囲を示すことである数字に

+1

これは正しい答えです。私が別のやり方をするのは、数値テーブルを作成する方法だけです(私は 'sys.all_objects'の' 'CROSS JOIN'をそれ自身と' 'ROW_NUMBER''を使用するつもりでした) – Lamak

+0

@Lamak - 数字を生成する別の方法 –

+0

タリーテーブルは、確かにパフォーマンスのための最良のアプローチです。カウントのための再帰的なcteは、カーソルとほとんど同じです。 http://www.sqlservercentral.com/articles/T-SQL/74118/ –

0

を高めるために参加し、他のクロスを追加します。簡単な方法は、lead()を使用しています。

select (index + 1) as first_missing, (next_index - 1) as last_missing, 
     (next_index - index - 1) as num_missing 
from (select t.*, lead(index) over (order by index) as next_index 
     from t 
    ) t 
where next_index <> index + 1; 

これは、すべての「内部」不足している範囲を示しています。数値の表を使用しないので、表のサイズや欠損値の数に関係なく効率的に機能します。

ではありません。は、表の最初と最後に「不足」の値を示しています。あなたの質問ではそれが問題として指定されていません。

関連する問題