SQL dotaz - vysvetleni reseni

Datesoft datesoft na centrum.cz
Pátek Březen 30 14:57:53 CEST 2001


> ten SQL dotaz by mel fungovat na ORACLE
> je jedno ktery radek to vytahne (nemusi byt prvni) jenom aby byl od kazdeho
> ID prave jeden


Je treba si uvedomit, jak je SELECT zpravovavany (neni tak dulezite), ale
hlavne co je jeho vysledkem. 


Priklad 1:

SELECT sl1, sl2 FROM  .... da vzdy matici. Stejne tak
SELECT * FROM
SELECT sl1 FROM  atd.

Priklad 2:

SELECT agregacni_fce(sl1) FROM ..... da vzdy skalar. Stejne tak
SELECT agr_fce(*) FROM         ..... 


Co dela GROUP BY: hodne lapidarne receno, radky, ktere maji v oznacenem
sloupecku stejnou hodnotu, poklada za jeden. Vysledkem je vektor.

Priklad 3:

SELECT rok FROM zapisky GROUP BY rok  .... da vektor vsech roku, kazdy
                                           prave jednou


Priklad 4:  (WRONG)

SELECT sl1, sl2 FROM tab GROUP BY sl1  .... ma dat vektor sl1 a zaroven
matici se sl2, coz je blbost. Tudiz takovy dotaz nelze polozit. 

Pokud je matematicke zduvodneni nejasne, snad pomuze logicke: kazdy
zobrazeny radek pro sl1 nepatri ke skutecnemu radku v tabulce. Nelze
udelat jednoznacne prirazeni (bez te matematiky to holt nejde), tudiz
nelze vedle sebe zobrazit konkretni hodnotu sl1 a zaroven sl2.

  
Priklad 5:

SELECT sl1, agr_fce(sl2) FROM tab GROUP BY sl1  .... ma dat vektor a
skalar. Neni to chyba, vysledkem je matice, ktera ma ve druhem sloupecku
vzdy stejnou hodnotu. 

Jenze POZOR! - sice to neni syntakticka chyba, ale vysledek je treba dobre
interpretovat.

Zpracovani takoveho dotazu probehne tak, ze se nejprve urci vysledek
agregacni fce pro sl2 (napr. minimalni hodnota), pak se spocita vektor
podle GROUP BY a nakonec se vysledky spoji do vysledne matice.

Cili vysledek neni takovy, jaky potreboval tazatel (od kazdeho ID prave
jedna hodnota druheho sloupce pro dane ID).


RESENI:

Zadani je potreba resit vice dotazy. Prvni dotaz urci unikatni ID, druhy
podle nich vybere jednu hodnotu druheho sloupce. Takze treba:

Dotaz 1: SELECT id FROM tab GROUP BY id

Dotaz 2: SELECT max(znak) FROM tab WHERE id = (vektor z dotazu 1)

Dohromady:

  SELECT id, max(znak) FROM tab 
    WHERE id = (SELECT id FROM tab GROUP BY id)



Hodne zdaru s vnorenymi SQL dotazy preje


			David



Další informace o konferenci Linux