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