ich habe ein kleines Problem: Ich hab eine Datenbank voll Artikel. Diese Artikel haben eine Haupt- und eine Unter-nummer. Zum Beispiel gibt es folgende Artiekl: 1-0; 1-1; 1-3; 1-4; 1-5 Die große Kunst besteht jetzt die nächst freie Unterartikelnummer zu finden. In diesem Fall wäre das zuerst die 1-2 und als nächstes die 1-6. Aber wie drück ich sowas per SQL aus??? Die Haupt und die Nebennummer stehen in einem separaten Feld.
Grundsätzlich etwa zb so wenn ich dich richtig verstanden habe:
SELECT Max(t.nebennr) AS MaxNr
FROM Tabelle t
GROUP BY t.hauptnr
HAVING t.hauptnr=1
wobei ich das in einer Mehrbenutzerumgebung so nie machen würde, weil die Nebennummer schon eine Millisekunde nach der Abfrage wieder anders sein kann.
es handelt sich um eine MS-Sql 2008 Datenbank. Problem bei der Sache ist das deine Abfrage den Max Wert in der Spalte raussucht. Aber da ist ja das Problem, ich will auch die „Lücken“ füllen, zB wenn es fogende Unternummern gibt:
1-0
1-1
1-2
1-4
1-5
würde deine Abfrage die 5 bringen + 1 ist es die nächst Freie. Hilft mir aber nix, wenn ich eigentlich die 3 als Lösung haben wollte, weil die noch nicht vergeben ist?
Hoffe ich konnte mein Problem verdeutlichen
vg
Thomas
Ich persönlich würde das über eine kleine .Net Funktion machen die die als CLR-Assembly eingebunden ist.
Ein TSQL Freak bekommt es vielleicht auch als SP hin, ich kenne aber keinen direkten Weg.
Es bleibt ja auch zu definieren welche Zahl du nimmst wenn es mehr als eine Lücke gibt. Die höchste oder die niedrigste oder eine dazwischen?
Wie enstehen denn die Lücken?
Wenn das was du da hast eine Identifizierung eines Artikels oder ähnliches ist, würde ich die Lücken entstandenen sowieso aus QS Gründen nie wieder benutzen.
Diese Artikel haben eine Haupt- und eine
Unter-nummer. Zum Beispiel gibt es folgende Artiekl: 1-0; 1-1;
1-3; 1-4; 1-5 Die große Kunst besteht jetzt die nächst freie
Unterartikelnummer zu finden. In diesem Fall wäre das zuerst
die 1-2 und als nächstes die 1-6.
So ähnlich? (vorausgesetzt, es gibt schon mindestens einen Artikel mit der Hauptnr.)
select unternr + 1 as frei
from artikel a
where hauptnr = 1
and not exists (
select \* from artikel
where hauptnr = 1
and unternr = a.unternr + 1
)
order by frei