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: