SQL dotaz - vysvetleni reseni
Karel Zak
zakkr na zf.jcu.cz
Pátek Březen 30 15:24:56 CEST 2001
On Fri, Mar 30, 2001 at 02:57:53PM +0200, Datesoft wrote:
>
> 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)
Nevim jak kde, ale
SELECT id, max(znak) FROM tab WHERE id = <neco>;
na PostgreSQL neprojde, protoze 'id' neni nicim aggregovano ani uvedeno v
GROUP BY klausuli....
Dalsi blbost je WHERE id = (subselect..) nema tam byt nahodou 'in'
vzhledem k tomu, ze ten subselect muze vracet vice radek.
Uz netusim co sice melo byt vysledkem, ale funkci prepis je asi takto:
SELECT max(cislo) FROM aaa
WHERE id IN (SELECT id FROM aaa GROUP BY id);
Coz IMHO rekne kulove, protoze dotaz
SELECT max(cislo) FROM....
pocita maximalni hodnotu ze vsech radek ktere odpovidaji podmince a
tedy vrati vzdy *jedno* cislo. A v logice toho celeho dotazu:
SELECT max(cislo) FROM aaa
WHERE id IN (SELECT id FROM aaa GROUP BY id);
pak znamena to "nejvetsi *jedno* cislo z dostupnych skupin
vytvorenych dle 'id'".
Takze to same jako:
SELECT max(cislo) FROM aaa
IMHO je dobre si ty dotazy vyzkouset nez to nekam poslu...
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
Další informace o konferenci Linux