Sie sind nicht angemeldet.

  • Anmelden

Lieber Besucher, herzlich willkommen bei: MastersForum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

18.01.2005, 20:54

SQL-Anfrage-Problem

Moin,
hab ein kleines Problem bei einer SQL-Anfrage, vielleicht kennt sich hier jemand damit aus und kann mir helfen:

Ich möchte die ersten X Tupel (Reihenfolge aus den Werten einer Spalte) ausgeben, jeweils die höchsten oder niedrigsten.

Beispielrelation:

Spieler(ID, Name, Punkte, u.s.w.)

Jetzt brauche ich eine Anfrage, die mir z.B. Name und Punkte der 5 besten Spieler (also die, mit den meisten Punkten) zurückgibt.
Der beste allein ist kein Problem, das geht mit der Max-Aggregation, aber ich bekomme keine Anfrage hin, die allgemeingültig für X Werte ist.

Jemand eine Idee?
Es sollte dem SQL-92-Standard entsprechen (besser) oder auf Oracle 9.i laufen. Anderes nützt mir wenig.

PS: Sorry, falls das zu trivial ist, bin SQL Anfänger, hab jedoch nirgends ein ähnliches Beispiel gefunden.

PS2: Bitte nicht in den Thread reinspammen, das mag ich nicht.

2

18.01.2005, 21:35

Ich versteh das Problem nicht genau.

Meinst du du hast probleme statt nur den besten, die besten 5 zu finden ?

oder gehts darum mehr als nur punkte zu berücksichtigen, sondern meinetwegen, punkte siege niederlagen ?

3

18.01.2005, 21:35

du meinst aber nicht.....

'order by punkte ASC/DESC limit 5'

????

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CULT_Horst« (18.01.2005, 21:37)


4

18.01.2005, 21:36

ORDER BY punkte ASC oder DESC wäre dann auf- und absteigend.

ka ob das gemeint ist

5

18.01.2005, 23:33

@max: aber wenn du auf bzw absteigend auf 5 einträge limitierst, hast ja auch die besten bzw. die schwächsten 5, oder?

Tsu_G_

Erleuchteter

Beiträge: 3 935

Wohnort: Berlin

Beruf: /dev/random

  • Nachricht senden

7

18.01.2005, 23:45

ja

8

19.01.2005, 11:06

Order By formatiert nur die Ausgabe und kann deshalb nur ganz am Ende der Anfrage verwendet werden.
Ich bräuchte aber etwas, was ich auch in einer Unteranfrage verwenden kann, dort kann man mit Order By nix anfangen.

9

19.01.2005, 11:29

Ganz am Ende ja, aber geht auch ganz am Ende einer Unterabfrage, also sinngemäß zB

SELECT name, wasauchimmer from T1 where keyT1 in
(SELECT keyT2 from T2 WHERE bedingung ORDER BY punkte DESC LIMIT 5)

wobei ich die Syntax LIMIT 5 nicht kenne, ich kene nur FETCH FIRST 5 ROWS ONLY aus UDB und WHERE ROWNUM <= 5 (wäre dann evtl. mit anderen Bedingungen mit AND zu verknüpfen) aus Oracle7

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »[AA]Hawk« (19.01.2005, 11:29)


10

19.01.2005, 13:29

limit gibts glaub ich nur bei mysql.

11

19.01.2005, 13:51

RE: SQL-Anfrage-Problem

SELECT TOP n [Percent] <Spalten>
FROM <Tabelle>
ORDER BY ... ASC/DESC

gibt die ersten n datensätze bzw. n prozent zurück; für die letzten musst du halt ASC beim order-by angeben.

(bezieht sich auf MS SQL Server)

hilft das?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »garista« (19.01.2005, 13:53)


12

19.01.2005, 14:30

Kannst ja auch je nach verwendeter Sprache der Seite wo du es nachher benutzen willst die Einschränkung erst dort auf alle Results machen. Wenn das net allzuviel Datensätze sind macht es bei der Performance auch keinen Unterschied.

13

19.01.2005, 15:06

Also das TOP-Dingens hab ich schonmal probiert, weil irgendwo im Internet mal gesehen - geht nicht bei Oracle.
Und wenn es Limit wirklich nur bei MySQL gibt, nützt mir das auch nichts.
Hmm, das WHERE ROWNUM>=X müsste ich noch ausprobieren, geht aber wohl erst morgen, da ich von hier aus keinen Zugriff auf die Datenbank habe.

Ich bräuchte schon etwas, was SQL-Standard ist, oder wie gesagt, zur Not, Oracle-spezifisch.

@Dark Man:
Ich brauche das nicht zur Verwendung in einer Website oder in einem Anwendungsprogramm, sondern es muss als Ad-Hoc-Anfrage funktionieren.
Nutze Oracle SQL Plus dafür.

14

19.01.2005, 15:56

Quellcode

1
2
3
4
5
6
7
8
9
SELECT  NAME,
        PUNKTE
	
  FROM ( SELECT NAME, 
  	           PUNKTE,
  	           rank() over (ORDER BY PUNKTE) PLATZ		
 	 FROM PLAYER_TABLE
       )
WHERE PLATZ < 6;


sowas ?

15

19.01.2005, 15:58

achja geht aber erst ab oracle 8i

ansonsten einfach nur rownum verwenden

16

20.01.2005, 16:41

Zitat

Original von SIM_BamBam_GP

sowas ?


Ja, genau sowas, damit geht es (zumindest bei Oracle 9i ;-)), danke.

Hat noch jemand eine allgemeine Lösung ohne systemspezifische Kommandos, also etwas, das wirklich überall läuft (nach SQL-92)?
Würde mich auch interessieren, auch wenn mein unmittelbares Problem jetzt erstmal gelöst ist.