Announcement

Collapse
No announcement yet.

Tiefste freie Nummer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tiefste freie Nummer

    Hallo Zusammen

    Meine Tabelle hat unter anderem folgende zwei Attribute: Nummerngruppe und Nummer.
    Bei einem HTML-Formular muss der Benutzer eine Nummerngruppe auswählen und bevor die Daten gespeichert werden muss ich die tiefste, noch freie Nummer für die gewählte Gruppe herausfinden. Die Nummern werden nach einer bestimmten Zeit wieder frei und müssen danach wieder vergeben werden, damit möglichst wenig Löcher entstehen.

    Beispiel:

    Nummerngruppe: Nummer:
    00 00
    00 01
    00 02
    00 04
    00 06
    10 00
    10 01
    10 03
    20 01
    20 02
    . .
    . .
    . .

    Wenn ich die tiefste Nummer für die Gruppe 00 will, muss ich 03 bekommen.
    Wenn ich die tiefste Nummer für die Gruppe 10 will, muss ich 02 bekommen.
    Wenn ich die tiefste Nummer für die Gruppe 20 will, muss ich 00 bekommen.

    Nun habe ich leider keine Ahnung , wie ich die tiefste, freie Nummer aus einer Spalte abfragen kann. Kann mir jemand weiterhelfen?

    Herzlichen Dank

    Mike

  • #2
    Mit einer normalen abfrage wird das nicht gehen.

    Comment


    • #3
      Evtl. schon (mit Hilfskonstrukt). Wie groß kann der Nummernbereich werden (Obere Grenze). Dann mit einer Hilfstabelle mit allen Nummern, diese gejoint (Outer Joint) auf die eigentliche Tabelle und nur die Nummern übrig lassen die in der Hilfstabelle vorhanden sind aber nicht in der eigentlichen Tabelle, dann kleiner Sort und erster Datensatz.

      Comment


      • #4
        Hallo!

        Erstmal die Testdaten:
        create table tempdb.dbo.test ( gruppe int, nummer int)
        insert into tempdb.dbo.test values ( 00, 00 )
        insert into tempdb.dbo.test values ( 00, 01)
        insert into tempdb.dbo.test values ( 00, 02)
        insert into tempdb.dbo.test values ( 00, 04)
        insert into tempdb.dbo.test values ( 00, 06)
        insert into tempdb.dbo.test values ( 10, 00)
        insert into tempdb.dbo.test values ( 10, 01)
        insert into tempdb.dbo.test values ( 10, 03)
        insert into tempdb.dbo.test values ( 20, 01)
        insert into tempdb.dbo.test values ( 20, 02)

        Die Abfrage:
        select min(nummer)-1 from tempdb.dbo.test
        where gruppe = 0
        and nummer > 0 and
        not exists(select a.nummer from tempdb.dbo.test a where a.gruppe = tempdb.dbo.test.gruppe
        and a.nummer = tempdb.dbo.test.nummer-1)

        So OK?

        BYE BERND

        Comment


        • #5
          danke

          ich probiere das gleich mal aus.

          danke schon mal!

          Comment


          • #6
            Bernd,

            das funktioniert so nicht ganz. Man erhält bei einer Lücke aus mehreren freien Nummern immer die oberste Zahl. Außerdem erhält man, wenn die unterste vorhandene Zahl eine 1 ist, als Ergebnis 0.
            Um die unterste Zahl einer Lücke zu erhalten muss man in der Abfrage statt mit -1 mit +1 arbeiten. Dies klappt aber dann wiederum nicht, wenn die unterste Lücke zwischen 0 und der untersten vergebenen Zahl liegt.

            Gruß frauwue
            docendo discimus

            Comment


            • #7
              @frauwue

              Stimmt die großen Lücken "wachsen" von oben her zu.

              Wenn keine Lücke vorhanden ist liefert das Statement NULL.

              Da ist also noch Verbesserungspotenzial...

              BYE BERND

              Comment


              • #8
                @Bernd

                select min(a.nummer)+1 from tempdb.dbo.test a
                where a.gruppe = gesuchtegruppe and
                not exists
                (select tempdb.dbo.test.nummer from tempdb.dbo.test where tempdb.dbo.test.gruppe = a.gruppe
                and tempdb.dbo.test.nummer=a.nummer+1)
                and exists
                (select tempdb.dbo.test.nummer from tempdb.dbo.test where tempdb.dbo.test.gruppe = a.gruppe
                and tempdb.dbo.test.nummer=1)

                Diese Abfrage liefert immer den richtigen Wert, außer wenn Nummer 1 nicht existiert. Dann kommt NULL raus. Dann ist aber der gesuchte Wert natürlich 1.
                Vielleicht kriegst Du das ja noch mit Case hin (Case geht bei mir nicht).

                Gruß frauwue
                docendo discimus

                Comment


                • #9
                  Hat Dir keine Ruhe gelassen oder?

                  BYE BERND

                  Comment


                  • #10
                    Hallo Bernd,
                    diese Lösung hatte ich gestern schon (noch bevor Dein Beitrag kam ). Ich hab's halt nur nicht geschafft, es mit meiner INFORMIX Datenbank mit "einem" SQL hinzukriegen; und das scheint ja in diesem Forum das Ziel der meisten Leute zu sein. Ist ja eigentlich Quatsch, wenn man von einer Programmebene aus auf eine Datenbank zugreift.

                    Eine Lösung mit UNION SELECT ginge auch, aber da bekommt man als Ergebnis zwei Datensätze einen mit NULL und einen mit der richtigen Lösung;
                    da würde ORDER BY und LIMIT helfen (aber LIMIT geht bei mir auch nicht).
                    Ich schreibe halt nur ungern etwas, was ich nicht testen kann (nur manchmal).

                    @Mike, welche Datenbank benutzt Du?

                    Gruß frauwue
                    docendo discimus

                    Comment

                    Working...
                    X