Nie rozumiem potrzeby łączenia się przez siebie. Czy ktoś może mi je wyjaśnić?
Prosty przykład byłby bardzo pomocny.
Nie rozumiem potrzeby łączenia się przez siebie. Czy ktoś może mi je wyjaśnić?
Prosty przykład byłby bardzo pomocny.
Odpowiedzi:
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
Łą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.).
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
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
i previous
. 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 kolumnach next
i previous
z tą samą id
kolumną tabeli .
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)
Table (Employee):
int id,
varchar name,
int manager_id
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
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.
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;
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
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
Łą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
Jest to odpowiednik bazy danych połączonej listy / drzewa, gdzie wiersz zawiera w pewnym zakresie odniesienie do innego wiersza.
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.