Seite 2 von 2 ErsteErste 12
Ergebnis 21 bis 26 von 26

Thema: [SQL] Eine bestimmte Zeile ausgeben

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Mach einfach die Semikola in den inneren Abfragen raus und vergiss nicht N durch ein Literal zu ersetzen.

  2. #2
    Er gibt zwar nun ein Ergebnis aus aber nicht das richtige.
    Das Problem ist, dass einige Zahlen, in der "ects" Spalte, mehrmals vorkommen und mit select distinct klappt es auch nicht.
    Ausserdem soll ich ja alles ausgeben, was zur Spalte gehört und nicht nur die Zahl alleine

  3. #3
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Er gibt zwar nun ein Ergebnis aus aber nicht das richtige.
    Das Problem ist, dass einige Zahlen, in der "ects" Spalte, mehrmals vorkommen
    Ich verstehe nicht, wieso es das falsche Ergebnis bei dir ausgeben soll. Es gibt genau die Zeile aus, die in der geordneten Tabelle an der Stelle N vorkommt. Ob da mehrere Zeilen mit einer ECTS-Zahl gibt, oder nicht, spielt keine Rolle und welche von denen nun gewählt wird, hängt von dem Sortieralgorithmus der Oracle-Datenbank ab, sowie von ihren ursprünglichen Positionen.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Ausserdem soll ich ja alles ausgeben, was zur Spalte gehört und nicht nur die Zahl alleine
    Deswegen habe ich auch ursprünglich col1, col2, ... geschrieben, du musst also alle Kolumnen, die du angezeigt haben willst, explizit angeben. Unbequem, aber ich kenne keinen anderen Weg.

    Edit: Achso, du wolltest also doch alle Vorkommnisse haben, so wie in Irians Ansatz, sowie nur distinkte ECTS-Zahlen in den inneren Auswahlen berücksichtigen.

    Geändert von Kyuu (21.11.2009 um 20:54 Uhr)

  4. #4
    So, habs nun endlich gelöst
    Danke an alle ^^

    Hier die Lösung:

    Code:
    select * 
    from studienleistung 
    where ects = ( SELECT ects
                   FROM (SELECT ects, ROWNUM rn
                         FROM (SELECT distinct ects
                               FROM studienleistung
                               WHERE ects IS NOT NULL
                               ORDER BY ects DESC)
                         WHERE ROWNUM <= 5)
                   WHERE rn = 5)
    ;

  5. #5
    Es sieht nun so aus:
    Code:
    SELECT ects
    FROM (SELECT ects, ROWNUM rn
          FROM (SELECT *
                FROM studienleistung
                WHERE ects IS NOT NULL
                ORDER BY ects DESC;)
         WHERE ROWNUM <= N;)
    WHERE rn = N;
    Da meldet er den Fehler "Rechte Klammer fehlt". In der Zeile, wo WHERE ROWNUM <= N;) steht aber ich wüsste nicht, wo da eine Klammer fehlen sollte.

    Zitat Zitat
    Das ist Irians Ansatz, aber es funktioniert definitiv auch. Unter diesen Umständen: Welche Oracle-Version benutzt du?
    Oracle® Database Express Edition 10g Release 2 (10.2)
    Ist halt die Version, die auch intern in der Schule verwendet wird und die sollen wir auch benutzen.

  6. #6
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Code:
    select *
    from studienleistung
    where ects is not null
    order by ects desc;
    Das ist jetzt die Innere. Wenn ich jetzt select *, rownum schreibe, meldet er sofort einen Fehler.
    Die äußere kann ich machen, was ich will. Nach den Methoden, die hier beschrieben werden, bekomm ich ebenfalls einen Fehler. Ansonsten ist und bleibt rownum = 52.
    Ich brauche schon die gesamte Abfrage, nicht nur die innere.

    select *, rownum ist falsch, denn entweder du willst implizit alle, oder du gibst die Spalten, die du brauchst explizit an.

    Außerdem musst du zuerst ordnen, bevor du ROWNUM benutzt, da ROWNUM sonst auf die ungeordneten Einträge angewendet wird und danach nach ECTS geordnet wird.

    Ohne jetzt deine ganzen Bezeichnungen genau zu kennen, sollte deine Abfrage wie folgt aufgebaut sein:

    1. Die innerste Abfrage wählt die Tabelle studienleistung und ordnet die Einträge nach ECTS:

    Code (SQL):
     
    SELECT *
    FROM studienleistung
    WHERE ects IS NOT NULL
    ORDER BY ects DESC;
     


    2. Aus dem Ergebnis der innersten Abfrage (also den geordneten Einträgen) wählt die nächstäußere Abfrage die ersten N Einträge mit Hilfe von ROWNUM:

    Code (SQL):
     
    SELECT ects, ROWNUM rn
    FROM (ErgebnisDerInnerstenAbfrage)
    WHERE ROWNUM <= N
     


    Wichtig hier, dass die ROWNUM-Werte, die hier rauskommen in der nächstäußeren Abfrage verfügbar sind, also zwischenspeichern in rn.

    3. Nun wählt die äußerste Abfrage aus dem Ergebnis der vorherigen Abfrage (also den ersten N Einträgen der nach ECTS geordneten Einträge aus studienleistung) den untersten Eintrag, also den N-ten Eintrag und zwar mit Hilfe des zuvor in rn gespeicherten ROWNUM-Wertes:

    Code (SQL):
     
    SELECT ects
    FROM (ErgebnisDerMittlerenAbfrage)
    WHERE rn = N;
     


    Hier können wir ruhig auf Gleichheit der ROWNUM-Werte prüfen, da sie in einer Spalte zwischengespeichert sind.

    Wenn du nun alle Abfragen in einander verschachtelst und die korrekten Bezeichnungen verwendest, sollte es funktionieren.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    edit:
    Nach deiner Methode
    Code:
    select *
    from studienleistung s
    where ( select count(*)
            from studienleistung d
            where s.ects < d.ects) = 4;
    gibt er nicht mal ein ein Ergebnis aus.
    Das ist Irians Ansatz, aber es funktioniert definitiv auch. Unter diesen Umständen: Welche Oracle-Version benutzt du?

    Zitat Zitat von Drakes Beitrag anzeigen
    Und du hast
    Code:
     SELECT ects FROM (SELECT ects FROM studienleistung ORDER BY ects DESC) WHERE ROWNUM=5
    wirklich schon ausprobiert?
    Ich habe doch bereits geschrieben, dass es nicht funktionieren wird. ^^

    Geändert von Kyuu (21.11.2009 um 19:59 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •