Lücken suchen
Problembeschreibung
Wenn Sie Lücken in einer Zahlenreihe suchen sollen, hilft Ihnen dieses Script.
Stehen z.B. die Zahlen
1, 2, 5, 6, 7, 8, 13, 14, 15, 18
in der Spalte ID der Tabelle "tabelle1", dann zeigt das Statement
SELECT ifnull(max(a.id), 0)+1 AS "Lücke von",
das Ergebnis an.
b.id-1
AS "Lücke bis"
FROM tabelle1 a,
tabelle1 b
WHERE a.id < b.id
GROUP BY b.id
HAVING ifnull(max(a.id), 0)+1 < b.id-1
;
Lücke von | Lücke bis |
---|---|
3 | 4 |
9 | 12 |
16 | 17 |
Hinweise
Die Funktion "ifnull" hat bei Oracle den Namen "nvl".
Die Funktion "ifnull" benötigt bei Sybase IQ noch einen dritten
Parameter, der genutzt wird, wenn der erste Parameter nicht NULL ist,
sonst ist das Ergebnis der Funktion NULL.
ifnull(max(a.id), 0)+1 ==> ifnull(max(a.id), 0, max(a.id))+1
Attributtyp Datum
Existiert eine Tabelle, in der ein Datensatz mit einer Ident ID von einem Zeitpunkt datum_von bis zu einem Zeitpunkt datum_bis gültig ist, kann man mit der folgenden Variante die Lücken in den Zeiträumen suchen.
select b.id, max(a.datum_bis), b.datum_von
from tabelle1 a,
tabelle1 b
where a.datum_bis <= b.datum_von
and a.id = b.id
group by b.id,b.datum
having b.datum-max(a.datum) >0
Quelle
Den Originalhinweis habe ich 1998 in einem Oracle-Forum gefunden.