The easiest method is to use table with numbers. Here is example:
Plamen Ratchev
CREATE TABLE Foo ( keycol INT NOT NULL PRIMARY KEY); INSERT INTO Foo VALUES(1); INSERT INTO Foo VALUES(5); INSERT INTO Foo VALUES(8); INSERT INTO Foo VALUES(9); INSERT INTO Foo VALUES(11); ;WITH N0 AS (SELECT 1 AS n UNION ALL SELECT 1), N1 AS (SELECT 1 AS n FROM N0 AS A, N0 AS B), N2 AS (SELECT 1 AS n FROM N1 AS A, N1 AS B), N3 AS (SELECT 1 AS n FROM N2 AS A, N2 AS B), N4 AS (SELECT 1 AS n FROM N3 AS A, N3 AS B), Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY n) AS n FROM N4) SELECT n AS missing_key_value FROM Nums WHERE n BETWEEN 1 AND (SELECT MAX(keycol) FROM Foo) EXCEPT SELECT keycol FROM Foo; /* missing_key_value -------------------- 2 3 4 6 7 10 */
Plamen Ratchev