» »

[SQL]Sortiranje subquery

[SQL]Sortiranje subquery

MrStein ::

Eno nagradno vprašanje: A se pri gnezdenem SELECT stavku sortiranje notranjega SELECT ohrani pri končnem rezultatu?

Primer:
SELECT * from (SELECT * FROM OSEBE WHERE SPOL = 'm' ORDERY BY ime) WHERE STAROST<15;


Bo končni rezultat sortiran po imenih?

(mislim na Oracle ampak se lahko splošno podebatira)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
  • spremenil: MrStein ()

darkolord ::

Ne. :)

Ponekod ti takega stavka sploh ne "skompajla". Izjema je, če imaš poleg še TOP/LIMIT, s katerim dejansko pofiltriraš vmesni rezultat. Drugače pa se notranji ORDER BY ignorira, važen je samo zunanji.

Zgodovina sprememb…

  • spremenilo: darkolord ()

MrStein ::

darkolord je izjavil:

Ne. :)

Res? Potem pa imaš par stvari Tom-u razložit. ;)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

MrStein ::

Klasični (vsepovsod priporočen) SQL za "izbiro strani iz rezultatov" je namreč:
SELECT *
FRMO  (
   SELECT id, col1, col2, rownum rn
   FROM (
      SELECT /*+ first_rows(50) */ id, col1, col2
      FROM   table1
      ORDER  BY id DESC
   )
   WHERE   rownum <= 50
)
WHERE  rn >= 1;


In rezultat je sortiran.
(velja za Oracle, drugje se "ostranjuje" drugače)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

MrStein ::

Oziroma:
select * 
  from ( select /*+ FIRST_ROWS(n) */ 
  a.*, ROWNUM rnum 
      from ( your_query_goes_here, 
      with order by ) a 
      where ROWNUM <= 
      :MAX_ROW_TO_FETCH ) 
where rnum  >= :MIN_ROW_TO_FETCH;


Iz tega članka: http://www.oracle.com/technetwork/issue...
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

darkolord ::

No saj, ROWNUM je ekvivalent TOP/LIMIT. Če v subqueriju dejansko filtriraš podatke na podlagi vrstnega reda, potem se bo ORDER BY upošteval, v nasprotnem primeru verjetno (ne poznam Oracla, ampak sklepam da je enako) ne.

V T-SQLu bo na primer tole šlo čez:
SELECT * FROM (SELECT TOP 10 * FROM neki ORDER BY burek DESC)


Tole pa ne:
SELECT TOP 10 * FROM (SELECT * FROM neki ORDER BY burek DESC)

Zgodovina sprememb…

  • spremenilo: darkolord ()

MrStein ::

Ja, zdaj vidim, da "nasploh" (ne-Oracle baze, pa tudi Oracle baze starih verzij ala 8.0) ORDER BY v "notranjem" SELECT (subquery) sploh ni dovoljen (razen izjem z TOP in podobno).

Sem že mojstra vprašal...
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Spura ::

Jst dajem v notranji in tudi zunanji query order by pa je.

Invictus ::

Spura je izjavil:

Jst dajem v notranji in tudi zunanji query order by pa je.

Dati zunanji in notranji sort je nepotrebno ...

Ni čudno da so vse web strani tako počasne ...
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

technolog ::

To ni razlog za počasnost. Za optimizator je to ta mala malica odstranit. Trpi edino preglednost kode.

Spura ::

Invictus je izjavil:

Spura je izjavil:

Jst dajem v notranji in tudi zunanji query order by pa je.

Dati zunanji in notranji sort je nepotrebno ...

Ni čudno da so vse web strani tako počasne ...

LOL ok, a ti mislis, da ce na zunanji select, ki ima 50 rowov das en order by, da ti ful poveca cas izvajanja querya, oziroma celo cas nalaganja strani?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

sql

Oddelek: Programiranje
61012 (717) Miha 333
»

Podatkovne baze - SQL enostavne poizvedbe

Oddelek: Programiranje
72057 (1650) galu
»

[Oracle] Osnovno povpraševanje problem

Oddelek: Programiranje
151912 (1553) zdravc
»

Sql pomoč

Oddelek: Pomoč in nasveti
8782 (742) zaaaz89
»

[PHP&MySQL] izpis prvih 3, drugih 3, tretjih 3... vnosov iz tabele. Kako?

Oddelek: Programiranje
111360 (1191) mHook

Več podobnih tem