Nie rozumiem potrzeby łączenia się przez siebie. Czy ktoś może mi je wyjaśnić?
Prosty przykład byłby bardzo pomocny.
Samosprzężenie można wyświetlić jako dwie identyczne tabele. Ale w normalizacji nie możesz utworzyć dwóch kopii tabeli, więc po prostu zasymuluj posiadanie dwóch tabel z samosprzężeniem.
Załóżmy, że masz dwie tabele:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Teraz, jeśli chcesz uzyskać nazwisko każdego pracownika wraz z nazwiskami jego szefa:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
Który wyświetli następującą tabelę:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
left join
Myślę, że lepiej byłoby nie pomijać pracownika (lub szefa), który nie ma szefa; najlepszy pies!Jest to dość powszechne, gdy masz tabelę, która odwołuje się do siebie. Przykład: tabela pracowników, w której każdy pracownik może mieć menedżera, a chcesz wyświetlić wszystkich pracowników i nazwisko ich kierownika.
SELECT e.name, m.name FROM employees e LEFT OUTER JOIN employees m ON e.manager = m.id
źródło
Łączenie własne to łączenie tabeli ze sobą.
Typowym przypadkiem użycia jest sytuacja, gdy tabela przechowuje jednostki (rekordy), które mają między sobą relację hierarchiczną . Na przykład tabela zawierająca informacje o osobie (imię i nazwisko, data urodzenia, adres ...) oraz kolumna zawierająca identyfikator ojca (i / lub matki). Następnie z małym zapytaniem, takim jak
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber FROM myTableOfPersons As Child LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID WHERE Child.City = 'Chicago' -- Or some other condition or none
w tym samym zapytaniu możemy uzyskać informacje o dziecku i ojcu (i matce, z drugą osobą itp., a nawet o dziadkach itp.).
źródło
Powiedzmy, że masz stół
users
, ustawiony w ten sposób:W tej sytuacji, jeśli chcesz wyciągnąć zarówno informacje o użytkowniku, jak i informacje o menedżerze w jednym zapytaniu, możesz zrobić to:
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
źródło
Są przydatne, jeśli Twój stół odwołuje się do siebie. Na przykład w przypadku tabeli stron każda strona może mieć łącze
next
iprevious
. Będą to identyfikatory innych stron w tej samej tabeli. Jeśli w którymś momencie chcesz uzyskać trzy kolejne strony, zrób dwa samosprzężenia w kolumnachnext
iprevious
z tą samąid
kolumną tabeli .źródło
Wyobraź sobie stół o nazwie
Employee
opisanej poniżej. Wszyscy pracownicy mają menedżera, który jest również pracownikiem (może z wyjątkiem dyrektora generalnego, którego manager_id miałby wartość zero)Następnie możesz użyć poniższej opcji, aby znaleźć wszystkich pracowników i ich menedżerów:
select e1.name, e2.name as ManagerName from Employee e1, Employee e2 where where e1.manager_id = e2.id
źródło
Bez możliwości odniesienia się przez tabelę do samej siebie, musielibyśmy utworzyć tyle tabel dla poziomów hierarchii, ile jest warstw w hierarchii. Ale ponieważ ta funkcja jest dostępna, dołączasz stół do siebie, a sql traktuje go jako dwa oddzielne tabele, więc wszystko jest ładnie przechowywane w jednym miejscu.
źródło
Oprócz odpowiedzi wymienionych powyżej (które są bardzo dobrze wyjaśnione), chciałbym dodać jeden przykład, aby można było łatwo pokazać użycie Self Join. Załóżmy, że masz tabelę o nazwie CUSTOMERS, która ma następujące atrybuty: CustomerID, CustomerName, ContactName, City, Country. Teraz chcesz wyświetlić listę wszystkich, którzy pochodzą z „tego samego miasta”. Będziesz musiał pomyśleć o replice tego stołu, abyśmy mogli do nich dołączyć na podstawie CITY. Poniższe zapytanie jasno pokaże, co to znaczy:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.City = B.City ORDER BY A.City;
źródło
Jest tu wiele poprawnych odpowiedzi, ale jest też odmiana, która jest równie poprawna. Możesz umieścić warunki złączenia w instrukcji złączenia zamiast w klauzuli WHERE.
SELECT e1.emp_id AS 'Emp_ID' , e1.emp_name AS 'Emp_Name' , e2.emp_id AS 'Manager_ID' , e2.emp_name AS 'Manager_Name' FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
Pamiętaj, że czasami chcesz e1.manager_id> e2.id
Zaletą znajomości obu scenariuszy jest to, że czasami masz mnóstwo warunków WHERE lub JOIN i chcesz umieścić warunki auto-złączenia w drugiej klauzuli, aby kod był czytelny.
Nikt nie odniósł się do tego, co się dzieje, gdy pracownik nie ma menedżera. Co? Nie są one zawarte w zestawie wyników. Co jeśli chcesz uwzględnić pracowników, którzy nie mają menedżerów, ale nie chcesz, aby zwracane były nieprawidłowe kombinacje?
Spróbuj tego szczeniaka;
SELECT e1.emp_id AS 'Emp_ID' , e1.emp_name AS 'Emp_Name' , e2.emp_id AS 'Manager_ID' , e2.emp_name AS 'Manager_Name' FROM Employee e1 LEFT JOIN Employee e2 ON e1.emp_id = e2.emp_id AND e1.emp_name = e2.emp_name AND e1.every_other_matching_column = e2.every_other_matching_column
źródło
Jednym z przypadków użycia jest sprawdzanie zduplikowanych rekordów w bazie danych.
SELECT A.Id FROM My_Bookings A, My_Bookings B WHERE A.Name = B.Name AND A.Date = B.Date AND A.Id != B.Id
źródło
Łączenie samoczynne jest przydatne, gdy musisz ocenić dane tabeli na sobie. Co oznacza, że skoreluje wiersze z tej samej tabeli.
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
Na przykład chcemy znaleźć nazwiska pracowników, których początkowe oznaczenie jest równe obecnemu oznaczeniu. Możemy rozwiązać ten problem za pomocą funkcji łączenia automatycznego w następujący sposób.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
źródło
Jest to odpowiednik bazy danych połączonej listy / drzewa, gdzie wiersz zawiera w pewnym zakresie odniesienie do innego wiersza.
źródło
Oto wyjaśnienie samołączenia w kategoriach laika. Łączenie własne nie jest innym typem łączenia. Jeśli rozumiesz inne typy złączeń (połączenia wewnętrzne, zewnętrzne i krzyżowe), złączenie samoczynne powinno być proste. W POŁĄCZENIACH WEWNĘTRZNYCH, ZEWNĘTRZNYCH i KRZYŻOWYCH dołączasz 2 lub więcej różnych stołów. Jednak w przypadku samodzielnego dołączania dołączasz do tego samego stołu. Tutaj nie mamy 2 różnych tabel, ale traktujemy tę samą tabelę jako inną tabelę przy użyciu aliasów tabel. Jeśli nadal nie jest to jasne, polecam obejrzenie następujących filmów z YouTube.
Dołącz do siebie na przykładzie
źródło