T-SQL: Fehlende Identity Nummern in einer Sequenz finden

Manchmal kann es hilfreich oder notwendig sein, fehlende Nummern in einer Sequenz herauszufinden. Hat eine Tabelle beispielsweise eine Identity-Spalte und es werden nachträglich Zeilen gelöscht fehlen die Werte, wie in folgender Beispiel-Tabelle dargestellt:

Um nun die fehlenden IDs (3, 6, 7, 11, …) in der Sequenz per MS-SQL zu selektieren genügt folgender Statement:

;WITH Missing (missnum, maxid)
AS
(
 SELECT 1 AS missnum, (select max(id) from TestTable)
 UNION ALL
 SELECT missnum + 1, maxid FROM Missing
 WHERE missnum < maxid
)
SELECT missnum
FROM Missing
LEFT OUTER JOIN TestTable tTable on tTable.id = Missing.missnum
WHERE tt.id is NULL
OPTION (MAXRECURSION 0);

Für Postgres-SQL (ab Version 8.4) lautet der Statement wie folgt:

SELECT series.missnum

FROM generate_series(0, (SELECT MAX(id) FROM Missing), 1) series(missnum)

WHERE NOT EXISTS (SELECT 1 FROM Missing WHERE id = series.missnum);

In der Ausgabe finden wir nun alle fehlenden IDs:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.