Autor: Ryszard Glab (rGLAB_at_waw.pdi.net)
Data: Sun 20 Apr 1997 - 17:05:04 MET DST
In article <335bf6ce.2804415_at_news.nask.pl>,
warta_olsztyn_at_telbank.pl (Grzegorz Bodaszewski) wrote:
>SELECT COUNT(szkody.nr_szkody), polisy.kolor_samochodu ;
>from polisy, szkody, klienci;
>where szkody.nr_samoch = polisy.nr_samoch ;
>and klienci.nr_klienta = polisy.nr_klienta ;
>and szkody.data between {1996.01.01} and {1996.06.30} ;
>and polisy.samochod = 'MALUCH' ;
>and klienci.miasto <> 'WARSZAWA' ;
>and klienci.wiek < 25 ;
>group by polisy.kolor_samochodu
>Niech baza polis ma 100 MB, klientow 25 MB, a szkod 10 MB.
>Na kazdym istotnym dla zapytania polu masz zalozone
>klucze indeksowe...
>Aha, najpierw to oprogramuj w Clipperze ! ;-)))))))))))
Nieznosze wojen religijnych ale jawne prowokacje wymagaja odpowiedzi
;-)
Zakladajac ze podane wielkosci baz odzwierciedlaja iloscI rekordow w
bazach i jesli dobrze zrozumialem zapytanie to mozna np. tak:
DBCREATE( 'TEMP', {{'kolor', 'C', 10, 0}, ;
{'nr_szkody', 'N',10,0}, {'ilosc','N',10,0}} )
USE temp NEW EXCLUSIVE
INDEX ON kolor+STR(nr_szkody,10) TO temp
SET ORDER TO temp
SELECT szkody
SET RELATION TO szkody->nr_klienta INTO klienci
SET SCOPE TO '19960101', '19960630'
GOTO TOP
DO WHILE( !EOF() )
IF( klienci->( FOUND() ) .AND. ;
!(klienci->miasto = 'WARSZAWA') .AND. klienci->wiek < 25 )
IF( polisy->( DBSEEK(szkody->nr_samoch) ) .AND. ;
polisy->samochod = 'MALUCH' )
IF( temp->( DBSEEK( polisy->kolor_samochodu+;
STR(szkody->nr_szkody,10)) ) )
temp->ilosc++
ELSE
temp->(DBAPPEND())
temp->kolor :=polisy->kolor_samochodu
temp->nr_szkody :=szkody->nr_szkody
ENDIF
ENDIF
ENDIF
SKIP
ENDDO
SET SCOPE TO
SET RELATION TO
SELECT temp
BROWSE
USE
Oczywiscie kod jest kilka razy dluzszy ale nawet bez dalszej
optymalizacji, (np. uzywajac dodatkowych indeksow w bazie klienci:
'miasto+nr_klienta' i w bazie polisy: 'samochod+nr_samochodu')
procedura wyszukiwania moze byc szybsza niz w Foxie - zwlaszcza na
wspomnianej poprzednio 386SX/16 4MB.
Pozdrawiam, Ryszard
-- r(ycho)GLAB Warsaw, Poland http://www.waw.pdi.net/~rglab
To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 16:03:12 MET DST