Avatar billede torbenkoch Nybegynder
21. september 2001 - 11:02 Der er 17 kommentarer og
1 løsning

TOP N

Hej alle,

I MS SQL kan man f.eks. lave en

select top 3 from table where x=3

som så kun returnerer max 3 records.

Hvordan gør man det i Oracle?? (8.1.7)
Avatar billede nosjns Nybegynder
21. september 2001 - 11:07 #1
Følgende selecter de 3 første:

SELECT * FROM (
    SELECT *
    FROM tabel1
    ORDER BY index_felt
  )
  WHERE rownum < 4
Avatar billede teepee Nybegynder
21. september 2001 - 11:12 #2
Det smarte ved denne sortering er faktisk at den kun bruger tid på at sortere de første tre rækker, og dermed IKKE tager alle rækker, sorterer dem, og dernæst tager de tre første, selvom man umiddelbart skulle tro det på sql-en.
Avatar billede psv Nybegynder
21. september 2001 - 11:17 #3
teepee> Eeeh - så er det jo ikke sorteret?
Avatar billede torbenkoch Nybegynder
21. september 2001 - 11:25 #4
Nosjns: Hvad nu hvis rownum for alle de records, hvor x=3 (som i mit eksempel) er større end f.eks. 4?
Avatar billede psv Nybegynder
21. september 2001 - 11:32 #5
Rownum er \"rækkefølgen\" i din cursor ikk\'?
Avatar billede nosjns Nybegynder
21. september 2001 - 11:35 #6
Din select vil se sådan ud:

SELECT * FROM (
    SELECT *
    FROM tabel1
    WHERE x=3
    ORDER BY index_felt
  )
  WHERE rownum < 4

Rownum er \"rækkefølgen\" fra mit sub-query resultset. Som starter med 1 og da du skal have de 3 første (top) skal det være mindre end 4.
Avatar billede torbenkoch Nybegynder
21. september 2001 - 11:38 #7
ok, så rownum er altså noget der genereres hver gang man selecter?

Jeg får lige prøvet skidtet af...
Avatar billede nosjns Nybegynder
21. september 2001 - 11:39 #8
Rigtigt Rownum genereres for hvert select.
Avatar billede nosjns Nybegynder
21. september 2001 - 11:42 #9
teepee: Hvad jeg kan læse ud af Oracles Dokumentation og hvad jeg selv har testet, er dette den rigtige måde.

Det er alle rækkerne der bliver sorteret og ikke kun de 3 første.
Avatar billede psv Nybegynder
21. september 2001 - 11:48 #10
Du har ganske ret nosjns. Det andet eksempel er korrekt!
Avatar billede psv Nybegynder
21. september 2001 - 11:49 #11
(Må hellere lige sige jeg testede begge dele *S*)
Avatar billede teepee Nybegynder
21. september 2001 - 12:04 #12
Rækkerne bliver sorteret ud fra index og afbrydes når den når rownum grænsen. Deror hvis du har en masse rækker a..b..c..d..e..f og disse er i index, så starter den med at sortere fra en ende af, altså a..b..c og så finder oracle selv ud af at yder-selecten ikke skal bruge flere og afbryder sorteringen af resten.
Avatar billede psv Nybegynder
21. september 2001 - 12:41 #13
Generelt er Oarcle nødt til at sortere alle rækker selv om der kun skal returneres nogle få stykker.. Ellers er det jo ikke \"de første\" man får fat i.. :-)
Avatar billede teepee Nybegynder
21. september 2001 - 14:01 #14
psv=> Sikke noget sludder. Læs f.eks i det seneste Oracle magazine om nøjagtig denne situation. Oracle afbryder selv når den \"har fået nok\". Og så skulle jeg hilse at sige at du kan jo bare prøve at lave en order by på en tabel med eks. 100.000 rækker og dernæst lave en select af de første tre af de 100.000 rækker og se at den avancerede tager betydeligt kortere tid. Hvis du er bekymret for cachen, kan du jo lave den avancerede søgning før den simple og stadig se at den simple tager betydeligt længere tid. Med avanceret mener jeg TOP N...
Avatar billede psv Nybegynder
24. september 2001 - 10:25 #15
Hehe - lige meget hvordan du end vender og drejer det skal du have sorteret alle 100.000 rækker.
(Eller i hvert fald have lokaliseret TOP N blandt alle 100.000)

Dvs. den sortere ikke fra en ende af som du siger... Men plukker de N første fra en i forvejen sorteret struktur!
Avatar billede nosjns Nybegynder
24. september 2001 - 10:28 #16
Det er derfor der er inkluderet en order by på et index-felt.
Avatar billede teepee Nybegynder
24. september 2001 - 11:20 #17
Jep, det er netop at der står \'index-\' foran feltnavnet, der gør at det kan lade sig gøre, ellers bliver søgning gangske tung. Hvis det var en order by på et ikke-indekseret felt var der ingen vej udenom.... alle rækker sorteres og derefter udvælges de første N.
Avatar billede psv Nybegynder
24. september 2001 - 11:28 #18
Jeg overgiver mig... :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB