Bài viết này cung cấp tổng quan về tự nối trong SQL, cũng như một ví dụ cơ bản.
Tự tham gia là gì?
SQL SELF JOIN
đang tham gia một bảng với chính nó. Nó có thể hữu ích để truy vấn dữ liệu phân cấp trong cùng một bảng hoặc so sánh các hàng trong cùng một bảng.
Ví dụ 1 - Tự còn lại tham gia
Một ví dụ cổ điển về tự tham gia là trong bảng Nhân viên. Trong một bảng như vậy, một nhân viên có thể báo cáo cho một nhân viên khác. Do đó, bạn có thể sử dụng tự nối để tham gia vào bảng trên cột ID nhân viên và cột ID người quản lý.
Giả sử chúng ta có bảng sau:
+--------------+-------------+------------+-------------+ | EmployeeId | FirstName | LastName | ReportsTo | |--------------+-------------+------------+-------------| | 1 | Homer | Connery | NULL | | 2 | Bart | Pitt | 1 | | 3 | Maggie | Griffin | 1 | | 4 | Peter | Farnsworth | 2 | | 5 | Marge | Morrison | NULL | | 6 | Lisa | Batch | 5 | | 7 | Dave | Zuckerberg | 6 | | 8 | Vlad | Cook | 7 | +--------------+-------------+------------+-------------+
Chúng ta có thể thực hiện tự kết hợp trái trên bảng này để trả lại tất cả nhân viên và người quản lý của họ.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Kết quả:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Homer Connery | | | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Marge Morrison | | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Homer Connery và Marge Morrison không báo cáo cho bất kỳ ai và vì vậy Manager
của họ trường trống. Trên thực tế, nó sẽ là NULL
nếu tôi chưa thực hiện nối chuỗi trên hai cột.
Ví dụ 2 - Tham gia tự bên trong
Nếu chúng tôi không muốn trả lại hai đầu honchos, thì chúng tôi có thể thực hiện nối bên trong trên bàn. Điều này sẽ loại bỏ bất kỳ hàng nào không khớp trong cả hai bảng (tức là những nhân viên không có người quản lý tương ứng và ngược lại).
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Kết quả:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Ví dụ 3 - Tự quyền
Nếu chúng tôi muốn thực hiện một phép nối tự quyền, chúng tôi sẽ cần xáo trộn một vài cột xung quanh trong truy vấn.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;
Kết quả:
+-----------------+------------------+ | Manager | Employee | |-----------------+------------------| | | Homer Connery | | Homer Connery | Bart Pitt | | Homer Connery | Maggie Griffin | | Bart Pitt | Peter Farnsworth | | | Marge Morrison | | Marge Morrison | Lisa Batch | | Lisa Batch | Dave Zuckerberg | | Dave Zuckerberg | Vlad Cook | +-----------------+------------------+