Tóm tắt :trong hướng dẫn này, bạn sẽ tìm hiểu về một kiểu liên kết đặc biệt được gọi là SQLite self-join cho phép bạn tham gia bảng với chính nó.
Lưu ý rằng bạn nên làm quen với INNER JOIN
và LEFT JOIN
các mệnh đề trước khi tiếp tục với hướng dẫn này.
Giới thiệu về tự tham gia SQLite
Tự tham gia là một loại liên kết đặc biệt cho phép bạn tham gia một bảng với chính nó bằng cách sử dụng LEFT JOIN
hoặc INNER JOIN
mệnh đề. Bạn sử dụng tự nối để tạo tập hợp kết quả nối các hàng với các hàng khác trong cùng một bảng.
Vì bạn không thể tham chiếu đến cùng một bảng nhiều hơn một bảng trong một truy vấn, bạn cần sử dụng bí danh bảng để gán tên khác cho bảng khi bạn sử dụng tự nối.
Phép nối tự so sánh các giá trị của các cột giống nhau hoặc khác nhau trong cùng một bảng. Chỉ một bảng tham gia vào quá trình tự tham gia.
Bạn thường sử dụng tự nối để truy vấn mối quan hệ cha mẹ / con cái được lưu trữ trong bảng hoặc để lấy tổng số đang chạy.
Các ví dụ về tự nối SQLite
Chúng tôi sẽ sử dụng employees
trong cơ sở dữ liệu mẫu để trình diễn.
employees
bảng lưu trữ không chỉ dữ liệu nhân viên mà còn dữ liệu tổ chức. ReportsTo
chỉ định mối quan hệ báo cáo giữa các nhân viên.
Nếu một nhân viên báo cáo với người quản lý, giá trị của ReportsTo
cột của hàng nhân viên bằng giá trị của EmployeeId
trong hàng của người quản lý. Trong trường hợp nhân viên không báo cáo cho bất kỳ ai, ReportsTo
cột là NULL
.
Để biết thông tin về ai là người báo cáo trực tiếp cho ai, bạn sử dụng câu lệnh sau:
SELECT m.firstname || ' ' || m.lastname AS 'Manager',
e.firstname || ' ' || e.lastname AS 'Direct report'
FROM employees e
INNER JOIN employees m ON m.employeeid = e.reportsto
ORDER BY manager;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Câu lệnh đã sử dụng INNER JOIN
điều khoản tham gia employees
cho chính nó. employees
bảng có hai vai trò:nhân viên và người quản lý.
Bởi vì chúng tôi đã sử dụng INNER JOIN
điều khoản tham gia employees
bảng cho chính nó, tập kết quả không có hàng có cột trình quản lý chứa NULL
giá trị.
Lưu ý rằng toán tử nối ||
nối nhiều chuỗi thành một chuỗi duy nhất. Trong ví dụ này, chúng tôi sử dụng toán tử nối từ tên đầy đủ của các nhân viên bằng cách ghép tên, khoảng trắng và họ.
Trong trường hợp bạn muốn truy vấn CEO không báo cáo với ai, bạn cần thay đổi INNER JOIN
mệnh đề LEFT JOIN
mệnh đề trong truy vấn ở trên.
Andrew Adams
là Giám đốc điều hành vì anh ta không báo cáo bất kỳ ai.
Bạn có thể sử dụng kỹ thuật tự tham gia để tìm các nhân viên ở cùng thành phố với truy vấn sau:
SELECT DISTINCT
e1.city,
e1.firstName || ' ' || e1.lastname AS fullname
FROM
employees e1
INNER JOIN employees e2 ON e2.city = e1.city
AND (e1.firstname <> e2.firstname AND e1.lastname <> e2.lastname)
ORDER BY
e1.city;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Điều kiện nối có hai biểu thức:
-
e1.city = e2.city
để đảm bảo rằng cả hai nhân viên đều ở cùng một thành phố -
e.firstname <> e2.firstname AND e1.lastname <> e2.lastname
để đảm bảo rằnge1
vàe2
không phải là cùng một nhân viên với giả định rằng không có nhân viên nào trùng họ và tên.
Trong hướng dẫn này, chúng tôi đã chỉ cho bạn cách sử dụng kỹ thuật tự nối SQLite để nối một bảng với chính nó.