I.
Wprowadzenie do  języków zapytań (1)
II.
Wprowadzenie do  języków zapytań (2)
III.
Pojęcia obiektowości w bazach danych (1)
IV.
Pojęcia obiektowości w bazach danych (2)
V.
Podstawy semantyczne języków zapytań
VI.
Modele składu obiektów
VII.
Stos środowisk, rezultaty zapytań, funkcja nested
VIII.
Język SBQL (Stack-Based Query Language) (1)
IX.
X.
Dalsze własności SBQL
XI.
Operatory order by i group by
XII.
Przetwarzanie struktur nieregularnych
  Wstęp
  1. Metody przetwarzania nieregularności w danych
  2. Nieregularne dane w modelach składu
  3. Konstrukcje w języku zapytań obsługujące dane nieregularne
  4. Możliwości zewnętrznych złączeń
  5. Problem z fałszywym wiązaniem
  6. Wartości domyślne
  Podsumowanie
  Zadania
XIII.
Rozszerzenie języków zapytań o konstrukcje imperatywne
XIV.
Procedury, procedury funkcyjne, metody, reguły zakresu
XV.
Parametry procedur i metod, procedury rekurencyjne, optymalizacja poprzez modyfikację zapytań

 

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 R1R2, 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, ZarStan, z których ZarStan są opcyjne (mogą nie wystąpić). Wówczas zapytanie:

P12.10.

Dla każdego pracownika zwróć nazwisko jako string, referencję do atrybutu Zar oraz referencję do atrybutu Stan:
Pracownik . struct incomplete(Nazwisko o "", Zar, Stan)

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 ZarStan. Przykładowo (iatr oznacza referencję do atrybutu atr), może zwrócić strukturę:

P12.11.

bag{ struct{ "Kowalski", iZar1, iStan1},
          struct{ "Pawlak", iZar2},
          struct{ "Nowak"},
          struct{ "Bilski", iStan4},
          struct{ "Wolski", iZar5} }

Analogiczne zapytanie

P12.12.

Pracownik.(Nazwisko o "", Zar, Stan)

zwróciłoby tylko

P12.13.

bag{ struct{ "Kowalski", iZar1, iStan1} }

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:

P12.14.

Pracownik.( (Nazwisko o "") as n,
          (if exists(Zarobek) then Zarobek else 0 ) as z,
          (if exists(Zajęcie) then Zajęcie else "brak zajęcia") as s))

67
Rys.67. Ilustracja normalnego i zewnętrznego złączenia

W tym przypadku podany wcześniej wynik uzyska regularną postać, nadającą się do wydrukowania w postaci tablicowego raportu:

P12.15.

bag{ struct{ n("Kowalski"), z(iZarobek1), s(iZajęcie1) },
          struct{ n( "Pawlak"), z(iZarobek2), s("brak zajęcia") },
          struct{ n( "Nowak"), z( 0 ), s("brak zajęcia") },
          struct{ n( "Bilski"), z( 0 ), s(iZajęcie4) },
          struct{ n( "Wolski"), z(iZarobek5), s("brak zajęcia") } }

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.