Zmodyfikuję trochę zawartość tabeli aby prawidłowo pokazać następne przykłady (zmiana id działu administracja):
Outer joins nie wymagają tego, aby w każdej z tabel był element o tej samej wartości elementu "łączącego" tabele. Zachowywany jest każdy rekord tabeli nawet jeśli żaden rekord drugiej tabeli do niego nie pasuje. Rozróżniamy left outer joins, right outer joins, and full outer joins w zależności od tego, z której tabeli chcemy zachować wszystkie wartości.
-------------------------------------------------------------------------------------------
Wynikiem operacji left outer join (lub wersja uproszczona left join) dla tabel A i B jest tabela zawierająca wszystkie rekordy z tabeli lewej (A) nawet jeśli wynik join nie znajduje odpowiedników z tabeli prawej - więc jeśli żaden z rekordów tabeli B nie pasuje do rekordów z tabeli A , join zwróci wiersze tabeli A z odpowiednią ilością wartości NULL w każdej kolumnie tabeli B.
Podsumowując left outer join zwraca wszystkie wartości z tabeli lewej + pasujące wartości z tabeli prawej ( w przypadku braku dopasowania pojawiają się pola NULL).
W sytuacji gdy do jednego wiersza tabeli lewej dopasowanych jest więcej wierszy z tabeli prawej, wiersze z tabeli lewej zostaną powtórzone tak, aby wszystkie dopasowania z tabeli prawej mogły być poprawnie wyświetlone.
SELECT * FROM pracownik LEFT OUTER JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
Jak łatwo zauważyć gdy zmianie uległo id administracji Kulikowski i Nowik stracili pracę ;) nie ma odpowiadających id działów (do których zostali przypisani) nazw działów stąd wartości NULL. Bez wykoannych zmian w tabeli wynik operacji left join wyglądałby następująco:
-----------------------------------------------------------------------------------------------------------------------
Lub w skrócie right join jest niemalże identyczny z left join z tą różnicą że zachowywana zawsze jest zawartość tabeli prawej - B. Jeżeli do wiersza z tabeli B pasuje więcej niż 1 wiersz z tabeli A wiersze z tabeli B będą zdublowane, nadomiast nalogicznie jeśli żaden rekord z tabeli A nie pasuje do rekordu z tabeli B zostaną wstawione wartości NULL.
SELECT * FROM pracownik RIGHT OUTER JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
Jak widać zgodnie z opisem pozostały tylko 4 rekordy, w administracji nikt nie pracuje i nie ma sytuacji gdzie kilku pracowników pracowałoby w jednym dziale ( brak powtórzeń rekordów z nazwami działów).
Powyższy efekt można uzyskać komendą left join zamieniając kolejność tabel w komendzie:
SELECT * FROM dzial LEFT OUTER JOIN pracownik
ON pracownik.ID_dzialu = dzial.ID_dzialu
---------------------------------------------------------------------------------------
Efektem tej operacji jest wynik łączący efekt left outer join i right outer join. Tabela wynikowa będzie zawiwerała rekordy z obu tabel i wypełni wartościąNULL brakujące dopasowania na każdej ze stron.
Pozwoli to przykładowo zobaczyć który pracownik pracuje w jakim departamencie, dodatkowo pokaże departamenty bez pracowników i osoby nie przypisane żadnemu departamentowi.
SELECT * FROM pracownik
FULL OUTER JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
Niektóre bazy danych w tym (MYSQL) nie obsługują tej funkcjonalności bezpośrednio, lecz mogą być emulowane za pomocą left join, right join i union.
SELECT *FROM pracownik
LEFT JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
UNION
SELECT *FROM pracownik
RIGHT JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
SQLite nie obłsuguje right join'ów więc outer join może byćemulowany w następujący sposób:
SELECT pracownik.*, dzial.* FROM pracownik
LEFT JOIN dzial
ON pracownik.ID_dzialu = dzial.ID_dzialu
UNION ALL
SELECT pracownik.*, dzial.* FROM dzial
LEFT JOIN pracownik
ON pracownik.ID_dzialu = dzial.ID_dzialu
WHERE pracownik.ID_dzialu IS NULL
-----------------------------------------------------------------------------------------------------------------------------
zapytanie to pozwala np znaleźć wszystkie dopasowania wewnątrz jednej tabeli np wszystkich pracowników z tego samego kraju. Jeśli posiadasz 2 oddzielne tabele z pracownikami i krajami oraz powiązaniami to nie ma problemu z wykorzystaniem poprzednich join'ów. Self join ma zastosowanie gdy wszystko odbywa się wewnątrz jednej wielkiej tabeli agregującej wszystkie dane.
wpis stowyrzłem na podstawie: Wikipedia
|
REKLAMA |
REKLAMA |
REKLAMA |
REKLAMA |
REKLAMA |
Falowniki Informacje na temat elektrycznych systemów napędowych. |
Fotografia cyfrowa Grupa dedykowana pasjonatom i amatorom fotografii cyfrowej. Rozmawiamy o sprzęcie fotograficznym ... |
KOŁA SEP Studenckie, pracownicze czy inne - wszystkie koła związane z działalnością Stowarzyszenia ... |
Studenci i absolwenci ... Grupa zrzeszająca studentów i absolwentów Politechniki Białostockiej |
REKLAMA |
Tego szukałem
pozdro dla Twórcy :D
Wielu z nas spotkało się z problemem polegającym na tym, że potrzebne nam dane rozmieszczone są w kilku bazach danych.
Podejrzewam że chodziło o tabele w bazie danych.