は
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を超えるであるならば、あなたは、クエリのこのタイプのための私の好みは範囲を示すことである数字に
これは正しい答えです。私が別のやり方をするのは、数値テーブルを作成する方法だけです(私は 'sys.all_objects'の' 'CROSS JOIN'をそれ自身と' 'ROW_NUMBER''を使用するつもりでした) – Lamak
@Lamak - 数字を生成する別の方法 –
タリーテーブルは、確かにパフォーマンスのための最良のアプローチです。カウントのための再帰的なcteは、カーソルとほとんど同じです。 http://www.sqlservercentral.com/articles/T-SQL/74118/ –