!> JcZYlC BAĆ. LJANTi.il
podzapytania zapisanego w wierszach od 7) do 9) mogłaby być na przykład relacja przedstawiona na rys. 5.6.
lylul |
rok |
Gwiezdne Wojny |
1977 |
Poszukiwacze zaginionej arki |
1981 |
Ścigany |
1993 |
RYSUNEK 5.6
Pary tytul-rok otrzymane w wyniku zapytania wewnętrznego
Teraz z kolei rozważmy pośrednie podzapytanie, zapisane w wierszach od 4) do 6). Jego wykonanie polega na tym, że zostaje sprawdzana relacja Film w poszukiwaniu krotek tych filmów, które są zapisane w relacji przedstawionej na rys. 5.6. Do wyniku tego podzapytania jest wpisywany numer certyfikatu prezesa, który występuje w znalezionej krotce. A zatem relacja wynikowa tego środkowego podzapytania zawiera numery certyfikatów producentów, którzy wyprodukowali filmy z udziałem Harrisona Forda.
W końcu rozważymy zapytanie ,.główne'’, zawarte w wierszach od 1) do 3). Jego wykonanie polega na sprawdzaniu krotek relacji FilmDyr w poszukiwaniu tych, których składowe cer1.# należą do zbioru utworzonego w wyniku przetworzenia podzapytania środkowego. Dla każdego odnalezionego producenta do wyniku jest dołączane jego nazwisko, a więc w ten sposób powstaje oczekiwany zbiór nazwisk producentów filmówr z udziałem Harrisona Korda.
□
Może się czasami zdarzyć, że zapytanie zagnieżdżone, które przedstawiono na rys. 5.5, tak jak i wiele zapytań zagnieżdżonych zostanie zapisanych jako pojedyncze zapytanie select-from-wrhere, w którym w klauzuli FROM wymienia się wszystkie trzy przeszukiwane relacje. Wówczas operatory :n zpodzapytań w nowym zapytaniu zostają zastąpione równościami w klauzuli WHERE. Na przykład zapytanie przedstawione na rys. 5.7 daje len sam wynik, co zapytanie zapisane na rys. 5.5. Różnica polega tylko na sposobie traktowania powtarzających sic krotek, np. George’a Lucasa to zagadnienie omówimy szerzej w p. 5.4.1.
SE1ECT nazwisko
FROM FilmDyr, Film, GwiazdyW
WHERE cert# = producentC# AND tytuł = tytułFilmu AMD rok rokFilmu AND nazwiskoGwia2ćy = 'Harrison Ford';
RYSUNEK 5.7
Producenci filmów z Fordem bez zagnieżdżonych podzapytań
Najprostsze podzapytania są wyliczane tylko raz, a ich wyniki są u żyw ne w zapytaniach zapisanych na wyższych poziomach. W bardziej skomp kowanych zapytaniach trzeba podzapytania wykonywać wielokrotnie, za ka dym razem, gdy zmienia się przypisanie wartości wyrażenia w podzapylan: które zależy z kolei od wartości zmiennych w krotkach tworzonych na i wnątrz podzapytania. Tego typu podzapytanie nazywamy podzapytanh skorelowanym. Rozważania na ten temat zaczniemy od przykładu.
PRZYKŁAD 5.19
Trzeba znaleźć tytuły, które oznaczają więcej niż jeden film. Rozpocznier od utworzenia zapytania zewnętrznego, które powoduje przeszukanie kroi relacji
Film(tytuł, rok, długość, czyKolor, nazwaStudia, producentC#)
Dysponując pojedynczą krotką w podzapytaniu sprawdzamy, czy istnieje fi! o tym samym tytule, ale późniejszym roku produkcji. Kompletne zapytar zostało przedstawione na rys. 5.8.
1} SEŁECT tytuł
2} FROM Film AS Stary
3) WHERE rok < ANY
4) (SELEC? rok
5) FROM Fi lir.
6) WHERE tytuł = Stary.tytuł
7) )
RYSUNEK 5.8
Wyszukiwanie tytułów tych filmów, które występują więcej niż jeden raz
Tak samo jak w przypadku poprzedniego zapytania zagnieżdżonego rc pocznijmy analizę od najbardziej wewnętrznego podzapytania, które zosta zapisane na rys. 5.8 w wierszach od 4) do 6). Jeśli w wierszu 6) wyrażer Stary.tytuł zastąpimy pojedynczym tekstem ' King Kong', to omawia podzapytanie będzie dotyczyło wyszukania roku lub lat produkcji fi In o tytule King Kong. Ale podzapytanie ma troszkę inną postać. Problem pole na tym, że nie wiadomo, o jaki konkretny tytuł chodzi w przypadku wyrażer Stary .tytuł. Jednakże, gdy przeglądamy po kolei krotki relacji fi lir., w' każdej pojedynczej krotce wiadomo, jaka wartość jest przypisywana i wyrażenia Stary, tytuł. I przy ustaleniu tej wartości, przy każdym wybór nowej krotki zapytania zewnętrznego, zapisanego w wierszach od 1) do ' powtarza się wykonanie podzapytania z wierszy od 4) do 6), w którym war