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

Thema: [SQL] Eine bestimmte Zeile ausgeben

  1. #21
    Dass SQL nicht nur was mit Webentwicklung zu tun hat, dürfte den meisten Leuten klar sein, denke ich. *schulterzuck*

    Zu deinem Problem: Du hast zum Teil recht (was die spezielle Abfrage angeht) und ich hab recht (was das Allgemeine über SQL angeht, das mit den inneren Queries hast du imho noch etwas missverstanden). Tatsächlich macht meine Abfrage Zicken, wenn die Situationen sehr speziell sind.

    Ich hab mal ne Testtabelle "test" angelegt mit 10 (ids 1-10) Zeilen mit ner Spalte "wert". Das Query ist also:

    Code:
    SELECT * FROM test t1 WHERE ( SELECT COUNT( * ) FROM test t2 WHERE t1.wert > t2.wert ) = 4;
    Beispiel 1: Die 10 Zeilen haben die Werte 10 bis 100:

    Dann ist das Ergebnis korrekterweise 5, 50

    Beispiel 2: Alle Zeilen haben den Wert 10

    Kein Ergebnis (0 Zeilen)

    Beispiel 2: Die Zeilen haben die Werte 10,10,10,20,20,30,40,50,60,70

    Kein Ergebnis (0 Zeilen)

    Das kommt daher, dass er genau 4 Zeilen finden will, die kleiner sind, in all diesen Fällen gibts aber mehr als 4 für die richtige Zeile. Einfach >= setzen geht auch nicht, weil er dann ALLE Zeilen ausgibt die größer sind (und wenn wir Limit hätten, hätten wir das Problem ja nicht).

    Die folgende Query könnte etwas besser sein, langsam wirs aber reichlich lächerlich (und in der Arbeit hätte ich auch schon lange zu nem Datenbank-spezifischen Befehl gegriffen *g*)...

    Code:
    SELECT * FROM test t1 WHERE ( SELECT COUNT( * ) FROM (SELECT * FROM test t3 group by t3.wert) t2 WHERE t1.wert > t2.wert ) = 4;

  2. #22
    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.

  3. #23
    Mach einfach die Semikola in den inneren Abfragen raus und vergiss nicht N durch ein Literal zu ersetzen.

  4. #24
    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

  5. #25
    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 21:54 Uhr)

  6. #26
    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)
    ;

Berechtigungen

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