1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Besten 3 Werte aus Verknüpften Tabellen ausgeben

Dieses Thema im Forum "Oracle" wurde erstellt von d1chty, 9 Januar 2012.

  1. d1chty

    d1chty Neuer Benutzer

    Hallo,
    ich hab folgendes Problem:
    Ich muss von einer orcale Datenbank , auf der ich nur read rechte habe ( kann also keinen VIEW erzeugen), folgenden Zugriff machen:
    Ich brauch den Nachnamen, Vornamen, Result (Ergebnis ), Einheit ( "Sportart"), Ort, Jahr und Disziplinnamen der besten 3 Sportler einer Disziplin.
    Die Tabellen sehen so aus


    ATHLETE: ANR, LASTNAME, FIRSTNAME, CID
    COUNTRY: CID, COUNTRY
    DISCIPLINE: DNR, DNAME
    RESULT: ANR,TNR,DNR RESULT, UNIT
    TOURNAMENT: TNR TNAME PLACE YEAR

    Mein SQL- Befehl sieht bis jetzt so aus:
    Code:
    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT WHERE (( TOURNAMENT.TNR = RESULT.TNR) AND ( RESULT.DNR = DISCIPLINE.DNR)) AND RESULT.DNR = "+ discipline +" ORDER BY RESULT DECS


    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT WHERE (( TOURNAMENT.TNR = RESULT.TNR) AND ( RESULT.DNR = DISCIPLINE.DNR)) AND RESULT.DNR = "+ discipline +" ORDER BY RESULT DECS

    "+ discipline +" ist eine Benutzer Eingabe die mit Hilfe von Java übergebenen wird





    Ich weiss das es mit mysql das ganz einfach zu lösen ist mit LIMIT 0,3 . Dies geht aber mir orcale leider nicht :(
    ich hab es auch schon mit rownum <4 probiert, dabei liefert er mir die ersten vier Einträge der Tabelle nach Result absteigend, aber nicht wie gewünscht nur die besten 3 Einträge. Ich hab keine Idee wie die Abfrage umgestallten muss, dass zuerst sortiert wird und dann die besten 3 ausgewählt werden. Ich weis jetzt leider nicht weiter, hab es auch schon mit




    Count(*) probiert, dabei gibt das System mir die Fehlermeldung:
    RA-00934: Gruppenfunktion ist hier nicht zulässig



    Kann mir einer helfen oder einen Tip geben wie ich es noch anderes lösen kann ?
    ( also jetzt nur mit SQL und nicht mit Java )
     
  2. ukulele

    ukulele Datenbank-Guru

    Müsste eigentlich wie folgt gehen:
    Code:
    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME
    FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT
    WHERE (( TOURNAMENT.TNR = RESULT.TNR)
    AND ( RESULT.DNR = DISCIPLINE.DNR))
    AND RESULT.DNR = "+ discipline +"
    AND    ROWNUM <= 5
    ORDER BY RESULT DECS 
    Kann kein Oracle SQL aber hab http://www.w3schools.com/sql/sql_top.asp ergoogelt.
     
  3. d1chty

    d1chty Neuer Benutzer

    Code:
    query="
    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME
    FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT
    WHERE (( TOURNAMENT.TNR = RESULT.TNR) AND ( RESULT.DNR = DISCIPLINE.DNR))
    AND RESULT.DNR = "+ discipline +" AND ROWNUM <= 5 ORDER BY RESULT DECS ";
        
    da bekomme ich leider:
    SQL Exception:
    ORA-00933: SQL-Befehl wurde nicht korrekt beendet
    ebenfalls wenn ich folgendes noch hinzufüge bekomme ich den gleichen fehler:

    Code:
    query="
    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME
    FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT WHERE
    (( TOURNAMENT.TNR = RESULT.TNR) AND ( RESULT.DNR = DISCIPLINE.DNR) AND (ATHLETE.ANR= RESULT.ANR))
    AND RESULT.DNR = "+ discipline +")
    AND ROWNUM <= 5 ORDER BY RESULT DECS ";
        
    und ich denke das ich sowas schonmal hatte und er dabei auch wieder erst die ersten Zeilen ausliest und danach erst sortiert. aber es soll ja genau so sein:
    -> Sortiere und dann gibt mir die besten 3 werte zurück

    aber schonmal vielen dank für die Hilfe
     
  4. ukulele

    ukulele Datenbank-Guru

    Wenn er ein paar Zeilen macht und erst dann in einen Fehler läuft sind möglicherweise irgendwelche NULL Werte das Problem.

    Und ich glaube du meinst ORDER BY RESULT DESC nicht DECS
     
  5. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    OK....


    Dei erster Versuch

    <code>
    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME
    FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT
    WHERE (( TOURNAMENT.TNR = RESULT.TNR)
    AND ( RESULT.DNR = DISCIPLINE.DNR))
    AND RESULT.DNR = "+ discipline +"
    ORDER BY RESULT DESC
    </code>

    ist gut. Wenn du KEINE persistente VIEW speichern kannst, ist dies egal. Du kannst es auch mit einer sogenannten "INLINE-VIEW" bewältigen.


    <code>

    SELECT TB.*

    FROM
    (

    SELECT LASTNAME, FIRSTNAME, RESULT, UNIT, PLACE, YEAR, DNAME
    FROM ATHLETE.ATHLETE, ATHLETE.DISCIPLINE, ATHLETE.RESULT, ATHLETE.TOURNAMENT
    WHERE (( TOURNAMENT.TNR = RESULT.TNR)
    AND ( RESULT.DNR = DISCIPLINE.DNR))
    AND RESULT.DNR = "+ discipline +"
    ORDER BY RESULT DESC

    )TB

    WHERE ROWNUM <= 3

    </code>


    LG
     
Die Seite wird geladen...

Diese Seite empfehlen