Restrikce v databazi

Honza Pazdziora adelton na informatics.muni.cz
Pondělí Listopad 25 12:06:24 CET 2002


On Mon, Nov 25, 2002 at 08:07:58AM +0100, Jan Serak wrote:
> > 
> > Poradite mi jak co nejednoduseji resit nasledujici SELECT
> > v tabulce :
> > 
> > User, Datum, Cena
> > 
> > Karel   21.10.2002    1000
> > Pavel   21.10.2002    1200
> > Eva     22.10.2002     1000
> > Karel   01.11.2002    1100
> > Vlado   01.11.2002    2000
> > 
> > Potrebuji vypsat aktulani ceny u vsech uzivatelu tj. klasicky select, ale s
> > tim omezenim, ze u uzivatelu pro ktere existuje vice cen se uvede pouze ta
> > nejnovejsi ?
> > Tj. v pripade Karla  1100.
> > 
> > Dik, nejak me napadaji sama "slozita" reseni.
> 
> 
> Nevim, jestli je to "slozite", ale jinak to asi nepujde:
> 
> select a.user,a.cena from <tabulka> a
>   where (a.user,a.datum) in (select b.user,max(b.datum) from <tabulka> b
> group by b.user)
> 
> Jednoduseji to v RDBMS nepujde. Musite totiz nejprve znat odpoved, ktere
> zaznamy jsou aktualni pro kazdeho uzivatele, a pak teprve zjistovat ceny
> v techto zaznamech.

Obcas mi Oracle dava (zvlaste v pripade, kdy tam nejsou jenom ty
bazove tabulky, ale je ten join slozitejsi) lepsi vypocetni strom,
pokud se to napise jako outer join (netestovano)

	select a.user, a.cena
	from <tabulka> a, <tabulka> b
	where a.user = b.user (+)
		and a.datum < b.datum (+)
		and b.datum null

> Ale lze to zjednodusit: zmenit vyznam atributu datum ze "zacatek
> platnosti" na
> "konec platnosti". Tim padem to lze rovnou:
> 
> 	select a.user,a.cena from <tabulka> a where a.datum is null;
> 
> Pokud potrebujete znat i zacatky platnosti, tak pouze pridate dalsi
> sloupec
> s datem ukonceni a uvedeny select jen lehce upravite, aby se zjistovala
> NULLovost jineho sloupce ;-)

Ovsem napsat trigger, ktery bude automaticky aktualizovat ty konce
platnosti pro jednotlive uzivatele, nemusi byt uplne trivialni,
konkretne u Oraclu se pri naivnim reseni anrazi na mutujici tabulku.

Jinak tohle reseni doporucuji, protoze se pak da snadno napsat

	select a.user, a.cena
	from <tabulka> a
	where sysdate between a.datum_od and a.datum_do

a je to pri vhodne konstelaci dotaz pres primarni klic.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
      ... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------


Další informace o konferenci Test