You are not logged in.

  • Login

1

Tuesday, January 18th 2005, 8:54pm

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

Tuesday, January 18th 2005, 9:35pm

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 ?

CULT_Horst

Professional

  • "CULT_Horst" has been banned

Posts: 1,741

Location: HSV

Occupation: GER

  • Send private message

3

Tuesday, January 18th 2005, 9:35pm

du meinst aber nicht.....

'order by punkte ASC/DESC limit 5'

????

This post has been edited 1 times, last edit by "CULT_Horst" (Jan 18th 2005, 9:37pm)


4

Tuesday, January 18th 2005, 9:36pm

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

ka ob das gemeint ist

Revolt

Professional

Posts: 1,411

Occupation: AUT

  • Send private message

5

Tuesday, January 18th 2005, 11:33pm

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

6

Tuesday, January 18th 2005, 11:45pm

jap :)

Posts: 3,935

Location: Berlin

Occupation: /dev/random

  • Send private message

7

Tuesday, January 18th 2005, 11:45pm

ja

8

Wednesday, January 19th 2005, 11:06am

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

Wednesday, January 19th 2005, 11:29am

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

This post has been edited 1 times, last edit by "[AA]Hawk" (Jan 19th 2005, 11:29am)


10

Wednesday, January 19th 2005, 1:29pm

limit gibts glaub ich nur bei mysql.

garista

Intermediate

Posts: 284

Location: Tumbolia

  • Send private message

11

Wednesday, January 19th 2005, 1:51pm

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?

This post has been edited 1 times, last edit by "garista" (Jan 19th 2005, 1:53pm)


ZwerG_DarkMan

Professional

Posts: 1,308

Location: Würzburg

Occupation: GER

  • Send private message

12

Wednesday, January 19th 2005, 2:30pm

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

Wednesday, January 19th 2005, 3:06pm

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

Wednesday, January 19th 2005, 3:56pm

Source code

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

Wednesday, January 19th 2005, 3:58pm

achja geht aber erst ab oracle 8i

ansonsten einfach nur rownum verwenden

16

Thursday, January 20th 2005, 4:41pm

Quoted

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.