Select pro vyber "der"

Miroslav BENES mbenes na tenez.cz
Pondělí Listopad 8 14:49:59 CET 1999


> Preji pekny den.
Ja tez.

> Jakozto zacatecnik s SQL jsem narazil na nasledujici problem:
> V tabulce ve sloupci dejme tomu ID je _temer_ souvisla rada cisel.
> Potrebuji ted napsat SELECT, ktery by vybral "diry" v teto rade
> (prakticky - porebuji pridelit nejnizsi volnou IP adresu).
> Myslel jsem, ze by to vyresil nasledujici SELECT:
> select ID + 1 from tab A 
> where not exist(
>   select ID from tab B
>   where A.ID = B.ID + 1
> );

Tohle je IMHO dost silena konstrukce. Predpokladam, ze tabuky A a B 
jsou identicke. Pak to znamena, ze hledas naslednika takoveho ID o 
kterem plati, ze ono samo neni naslednikem zadneho ID.

Zduvodneni :
V subselectu se hleda ID, jehoz naslednikem (B.ID+1) je ID z hlavniho 
selectu (= A.ID). Proto mi hlavni select vrati A.ID, o kterem plati, 
ze ze neni naslednikem nikoho - a pak ho o 1 zvetsi.

Priklad :
pro rade napr. 1 2 5 6  podminky  plati pro :
A.ID = 1, resp. 5.
Nenajde se B.ID = 0, resp. 4, takze subselect bude prazdny a hlavni 
select  vrati A.ID +1 => 2, resp. 6 (a to je spatne).


Co treba takhle (omlouvam se za nepresnosti, protoze detaily syntaxe 
neznam) :

select ID + 1 from tab IP_ADR alias A 
where not exist (
	select ID from tab IP_ADR alias B
	where B.ID = A.ID +1 )
Tady se hleda ID, ktere nema naslednika - a pak se zvetsi o 1 -> melo 
by vratit spravne hodnodty 3, resp. 7 (viz predchozi priklad).


--------------------------
Miroslav BENES
E-mail   : mbenes na tenez.cz
TENEZ Chotebor, a.s
--------------------------


Další informace o konferenci Databases