kann es solche eine abfrage geben?
-
ein arbeitskollege meinte neulich, er hätte in irgenteiner datenbankfachzeitschrift eine abfrage gesehen, mit der es möglich war, die fehlenden zahlen in einer zahlenspalte mit lücken einer tabelle herauszufinden und auszugeben. und das, OHNE
irgentwelche datenbanksystemspezifischen funktionen bzw. procedures zu benutzen. sprich: nur reines sql, keine views, keine temporären tabellen, keine stored procedures und alles mit nur EINER abfrage!beispiel, wie ich das meine:
man hat ne tabelle mit einer spalte "nr":
nr1
2
4
5
9
10und er liefert mit der "geheimnisvollen" abfrage die fehlenden nummern:
nr
3
6
7
8zurück.
ich hab ne abfrage geschrieben, mit der er zwar fehlende nummern liefert, allerdings klappt das system nicht mehr, wenn der abstand zwischen den zahlen grösser 1 ist. hab auch ne andere abfrage hinbekommen, die mir alle zahlen und die anzahl der darauf fehlenden nummern ausgibt. aber eben nicht alle zahlen direkt.ich kann mir persönlich nicht vorstellen wie sowas gehen soll, da man ja nicht daten aus nichtvorhandenen daten erzeugen kann. bei jeglicher datenbankabfrage verknüpfe ich ja im prinzip nur bestehende datenmengen miteinander und als ergebnis erhalte ich einen teil der bestehenden daten und nicht daten, die noch nicht da waren.
was sagt ihr dazu?
-
SELECT nr FROM nummern n, (SELECT 1 as nr UNION SELECT 2 as nr UNION SELECT 3 as nr UNION SELECT 4 as nr UNION SELECT 5 as nr UNION SELECT 6 as nr UNION SELECT 7 as nr UNION SELECT 8 as nr UNION SELECT 9 as nr UNION SELECT 10 as nr) a WHERE n.nr != a.nr;
vieel tipparbeit
geht nicht, du brauchst eine beschränkung
Mit der Ergebnismenge hast du auch Recht.dein geliebter sql-troll
PS: wir kennen uns!
-
select nr from nummern s where not exists (select nr from nummern where nr =s.nr +1)
Upps falsch!
-
Geht nicht in einem (als Zahl zu sehen) Query und einer Tabelle.
-
@sql-troll
also da komme ich nicht drauf, wer du sein kannst. villeicht verwechselst du mich mit jemandem?
gib mir doch mal nen tipp.
-
mich ließ dieses problem über die jahre irgendwie nicht los und heute habe ich durch zufall die lösung endeckt. ja, es gibt doch eine lösung. der sql standart von 1999 führt rekursive cte´s ein, damit ist die aufgabe dann doch mit plain sql lösbar:
tabelle: "daten", eine spalte "da_id", folgende nummern sind vorhanden:
1,2,5,7,15
er liefert mit folgender abfrage alle fehlenden zahlen:
3,4,6,8,9,10,11,12,13,14WITH RECURSIVE
tempTable(x) AS
(
SELECT 1
UNION
SELECT x+1 FROM tempTable LIMIT (SELECT MAX(da_id) from daten)
)
SELECT a.x
FROM tempTable a
LEFT JOIN daten b on b.da_id=a.x
WHERE b.da_id is null;getestet unter sqlite.
das nenn ich am ball bleiben !