Besten 3 Werte aus Verknüpften Tabellen ausgeben

d1chty

Neuer Benutzer
Beiträge
2
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 )
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
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.
 

d1chty

Neuer Benutzer
Beiträge
2
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
 

ukulele

Datenbank-Guru
Beiträge
4.582
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
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
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
 
Oben