Języki i Środowiska Programowania Baz Danych | |||||||||||||
|
4. Możliwości zewnętrznych złączeń Zewnętrzne złączenie (outer join) w systemach relacyjnych ma na celu zachowanie w złączeniu całej informacji ze złączanych tabel. Niech złączenie dotyczy relacji R1 i R2, według kolumny A w relacji R1 i kolumny B w relacji R2. Jeżeli krotka r relacji R1 ma wartość v w kolumnie A, ale v nie występuje w kolumnie B, wówczas w normalnym złączeniu krotka r jest pomijana w wyniku. Inaczej jest w zewnętrznym złączeniu, gdzie krotka r jest w takiej sytuacji przedłużana o wartości NULL we wszystkich kolumnach pochodzących z relacji R2. Jest to jedna z form tego złączenia zwana "lewostronną". Lewostronne złączenie nie traci informacji z tabeli R1, ale może stracić informację z R2, Analogicznie, można zdefiniować zewnętrzne złączenie "prawostronne", gdy rozważamy kolumnę B relacji R2, zaś ewentualne wartości NULL dopisujemy w kolumnach pochodzących z R1 oraz "obustronne", gdzie rozważamy zarówno A, jak i B. Prawostronne zewnętrzne złączenie nie traci informacji z R2, zaś obustronne zewnętrzne złączenie nie traci informacji z obydwu złączanych tabel, patrz Rys.67. Zewnętrzne złączenie nie jest operacją elementarną, gdyż da się wyrazić przez inne operatory SQL. Dla niektórych zadań wyszukiwawczych jest jednak bardzo wygodne, ze względu właśnie na to, że nie traci informacji, przez co umożliwia np. sporządzanie kompletnych raportów pochodzących z dwóch lub więcej tabel. Przyjmujemy więc, że w sytuacji nieregularnych danych w definiowanym przez nas języku powinna być funkcjonalność analogiczna (pragmatycznie równoważna) do zewnętrznego złączenia. Ponieważ nie wprowadziliśmy i nie zamierzamy wprowadzić wartości NULL, istotne jest dla nas takie podejście, w którym zachowujemy cel pragmatyczny, a nie konkretny sposób znany z SQL. Tym celem pragmatycznym jest uniknięcie straty informacji w sytuacjach równoważnych do złączeń w relacyjnych bazach danych. Tej funkcjonalności może dostarczyć specjalny konstruktor struktury, który nazwiemy struct incomplete. Przy rozumieniu operatora struct jako uogólnionego iloczynu kartezjańskiego, jeżeli jakiekolwiek zapytanie będące jego argumentem zwróci pusty bag, wówczas wynik całości też jest pusty. Aby uzyskać interpretację równoważną pragmatycznie zewnętrznemu złączeniu, musimy zmienić nieco ten operator na struct incomplete. Jeżeli jakieś zapytanie qi będące argumentem operatora struct incomplete zwróci pusty bag, wówczas takie zapytanie jest ignorowane (nie uczestniczy w tworzeniu wyniku). To oznacza, że zwracane struktury są w takim przypadku krótsze o jeden lub więcej elementów. Przykładowo, przyjmijmy, że obiekty Pracownik mogą posiadać atrybuty Nazwisko, Zar i Stan, z których Zar i Stan są opcyjne (mogą nie wystąpić). Wówczas zapytanie:
może zwrócić bag struktur o długości 1, 2 lub 3, w zależności od obecności bądź nieobecności atrybutów Zar i Stan. Przykładowo (iatr oznacza referencję do atrybutu atr), może zwrócić strukturę:
Analogiczne zapytanie
zwróciłoby tylko
co oznaczałoby stratę informacji. Nieregularne struktury zwracane przez struct incomplete są trudniejsze dla mocnej kontroli typu i "tablicowej" reprezentacji obiektów, ale są bardziej elastyczne. Dla niektórych zastosowań, w szczególności dla technologii opartych na XML, mogą być nieuniknione. W sytuacji, gdy zależy nam na dobrze sformatowanych strukturach, np. dla celów raportowania lub przetwarzania wyniku zapytania przez język programowania z mocną kontrolą typu, możemy zastosować metodę wartości zastępczych. Metoda polega na tym, że jeżeli pewnej danej nie ma, to zamiast niej programista generuje w zapytaniu wybraną wartość zastępczą, której typ jest zgodny z oczekiwanym typem nieobecnej danej. W tym celu może posłużyć się dowolnymi już wprowadzonymi opcjami SBQL, np. funkcjami count, exists, kwantyfikatorami i innymi. Np. wynik podanego wyżej przykładu można byłoby w ten sposób uczynić regularnym poprzez napisanie nieco dłuższego zapytania:
W tym przypadku podany wcześniej wynik uzyska regularną postać, nadającą się do wydrukowania w postaci tablicowego raportu:
Za pomocą podanych konstrukcji programista może osiągnąć nie tylko wszystkie efekty, które były osiągalne poprzez zewnętrze złączenie, ale także może opanować kwestię nieregularności w danych we wszystkich innych sytuacjach. |
||||||||||||
Copyrights © 2006 PJWSTK Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS. |