Vyzaduje group by order by?

Jan Serak sherry na pikebo.cz
Středa Srpen 9 12:14:57 CEST 2000


Ondrej Koala Vacha wrote:
> 
> On Wed, 9 Aug 2000, Honza Pazdziora wrote:
> 
> > > muze se stat, ze
> > >
> > > select xx,sum(ks) group by xx order by yy
> >               ^^^^^
> >               predpokladam, ze tady je jeste nejake from table
> >
> 
> Samozrejme, moje opomenuti :(
> 
> > Oracle Vam na tohle rekne
> >
> >       ORA-00979: not a GROUP BY expression
> >
> > a ukaze na to yy. Proste ten sloupec yy tam neexistuje, existuje jenom
> > to, co pustite ven pres group by, tedy sloupce pres ktere groupujete
> > nebo agregace.
> 
> >
> > Ale Vy prece muzete mit zaznamy
> >
> >       xx      yy      ks
> >       123     8       1
> >       123     4       2
> >       098     1       1
> >       098     8       2
> >
> > Vysledek je pak
> >
> >       xx      sum(ks)
> >       123     3
> >       098     3
> >
> > A jak byste tady chtel tridit podle yy? Ve vysledku mate pouze sloupce
> > xx a sum(ks) a ty yy jdou napric nimi.
> >
> 
> No chtel... Nechtel. Ale moho by to taky fungovat tak, ze seznam se
> najprve setridi podle order by
> 
>          xx      yy      ks
>         098     1       1
>         123     4       2
>         123     8       1
>         098     8       2
> >
> 
> a teprve _pak_ group-ne. Pak bych dostal
> 
>         xx       sum(ks)
>         098       1
>         123       3
>         098       2
> 
> V zasade mi jde o to, zda je zaruceno, ze vysledek bude takovy, jako by se
> napred tridilo a group-ovalo podle goup by a teprva pak podle order by
> anebo opacne.

Relacni databaze pracuji s mnozinami a SQL umoznuje deklarovat dotaz aniz
by melo prilis vyznamny vliv na algoritmus vypoctu. GROUP BY xx semanticky
znamena, ze se nad vybranymi zaznamy provede mnozinovy
rozklad podle hodnoty xx a agregacni funkce (sum, max, min, count,...)
vypocte hodnoty pro jednotlive komponenty mnozinoveho rozkladu.
Neni tedy mozne, aby vysledkem GROUP BY xx byl vice nez jeden zaznam
pro jednu hodnotu xx.

Vasi predstavu nelze mnozinove realizovat. Order by je do SQL pouze
pridano kvuli "formatovani vysledku dotazu" a uplatni se vzdy az jako
posledni operace dotazu.

Proc se Oracle chova tak, jak popsal Adelton? Je to jednoduche: aby byl
co nejrychlejsi, tak nejprve provede ORDER BY podle sloupcu, ktere
uzivatel vyjmenoval v GROUP BY. Mezivysledek si docasne ulozi 
a nad nim jiz jednopruchodove provede agregaci(-e), pricemz vygeneruje zaznam
vzdy kdyz dojde ke zmene n-tice sloupcu, podle nichz ma data setridena.

					Jan Serak


Další informace o konferenci Databases