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 Test