Announcement

Collapse
No announcement yet.

Unterabfrage, rownum

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

  • Unterabfrage, rownum

    Ich nutze eine Oracle-Datenbank und habe folgende Aufgabenstellung:

    Als erstes soll eine sortierte Tabelle erzeugt werden:
    SELECT p_NAME, p_VORNAME, p_GEBDAT
    FROM PATIENT
    ORDER BY p_NAME, p_VORNAME, p_GEBDAT

    Die Datenbank besitzt ca. 500 Datensätze.
    Die Aufgabenstellung sieht es vor, jeweils 100 Datensätze pro Select-Ausführung auszugeben.

    D.H. ich brauche nach meinem Wissen erst einmal einen ZeilenZähler (rownum, wird umbenannt in "ZZ") und eine Unterabfrage für die Einschränkung auf jeweils 100 Datensätze (Zwischenspeicher der rownum).
    Die Abfrage sieht dann so aus:

    SELECT ZZ, NAME, VORNAME, GEBDAT
    FROM (SELECT rownum AS ZZ, NAME, VORNAME, GEBDAT
    FROM PATIENT
    ORDER BY NAME, VORNAME, GEBDAT
    )

    WHERE ZZ BETWEEN 1 AND 100

    Die WHERE-Bedingung wird bei jedem Durchlauf angepasst (101 -200, 201-300, etc.).
    Nun bekomme ich die ersten 100 Datensätze sortiert nach Name, Vorname, Geburtsdatum.

    ZZ | Name | Vorname | Gebdat

    4 |Aa | Aa |1.1.1983
    39 |Ab | Ab |1.1.1942
    23 |Bb | Bast |2.4.1956
    88 |Cc | Conner |24.4.1942

    Rownum „ZZ“ soll laut Aufgabenstellung für Datensatz 1 Nummer 1 haben – Datensatz 2 Nummer 2 etc...

    Nach meinem jetzigen Stand wir die rownum vor der sortierung erzeugt, und durch die sortierung "durcheinandergewirbelt". Ich müsste demnach erst die sortierte Liste (Name, Vornme, Gebdat) erstellen und anschließend die rownum durchlaufen lassen.

    Ich bekomme das momentan überhaupt nicht hin. Brauche ich da noch eine Unterfrage?

    Vielleicht könnt ihr mir weiter helfen!! Besten Dank euch )
    Zuletzt editiert von OneTwoTh; 26.06.2013, 15:59.

  • #2
    Nein, die ROWNUM wird erst am Schluss (innerhalb der Sub-Query) gebildet, deine Abfrage sollte so funktionieren.

    Gruss

    Comment


    • #3
      Besten Dank erstmal für die schnelle Rückmeldung. Ich habe die Abfrage so auf der Datenbank ausgeführt.
      Die rownum beginnt leider nicht bei der 1...
      Zuletzt editiert von OneTwoTh; 26.06.2013, 16:28.

      Comment


      • #4
        Deine Abfrage muss du so aufbauen:

        Code:
        SELECT rownum AS ZZ, NAME, VORNAME, GEBDAT
           FROM (SELECT NAME, VORNAME, GEBDAT
                   FROM PATIENT 
                  ORDER BY NAME, VORNAME, GEBDAT
        )
        WHERE rownum <=  100;
        kuemmelchen

        Comment


        • #5
          Nebenbei, die gerade erschienene Version Oracle 12c unterstützt das "native":

          row_limiting_clause



          Gruss

          Comment


          • #6
            Das funktioniert so leider nicht @kuemmelchen.
            Die Durchläufe (WHERE rownum BETWEEN 1-100 ... 101 -200, 201-300, etc.) können so nicht angepasst werden .

            Ich werden mit aber mal die row_limiting_clause anschauen.

            Comment


            • #7
              Originally posted by OneTwoTh View Post
              Ich nutze eine Oracle-Datenbank und habe folgende Aufgabenstellung:



              Die Datenbank besitzt ca. 500 Datensätze.
              Die Aufgabenstellung sieht es vor, jeweils 100 Datensätze pro Select-Ausführung auszugeben.


              Vielleicht könnt ihr mir weiter helfen!! Besten Dank euch )

              LIMIT und OFFSET gibt es meines Wissens nach auch bei Oraggle.

              Comment


              • #8
                Kümmelchens Lösung leicht modifiziert sollte laufen, wenn man zz in der SUBQUERY bildet:
                Code:
                SELECT ZZ, NAME, VORNAME, GEBDAT
                   FROM (SELECT NAME, VORNAME, GEBDAT, rownum zz
                           FROM  PATIENT 
                          ORDER BY NAME, VORNAME, GEBDAT
                )
                WHERE 
                --zz between   1 AND  100
                  zz between 201 AND  300
                ;

                Comment


                • #9
                  Die korrekte Lösung mit Rownum gibt im Crossposting: http://www.fachinformatiker.de/daten...ml#post1417576
                  Zitat Tom Kyte:
                  I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                  Comment

                  Working...
                  X