1. Mệnh đề SELF JOIN
Mệnh đề SELF JOIN được thực hiện trên 1 bảng. Bảng này sẽ tự kết nối với chính nó nghĩa là, mỗi bản ghi của bảng được nối với chính nó hoặc tất cả các bản ghi khác tùy thuộc vào một số điều kiện. Nói cách khác, chúng ta có thể nói rằng SELF JOIN nó là một phép kết nối giữa hai bản sao của cùng một bảng.
Cú pháp mệnh đề SELF JOIN như sau:
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
Trong đó:
- SELECT là câu lệnh chọn
- column_name(s) ...là các cột được chọn lấy ra dữ liệu
- T1, T2 là các bí danh bảng khác nhau cho cùng một bảng.
2. Ví dụ SELF JOIN
Dưới đây là bảng có tên KhachHang bao gồm các cột là: ID, TenKH, DiaChi, ThanhPho, SoDienThoai
ID | TenKH | DiaChi | ThanhPho | SoDienThoai |
1 | Nguyen Van A | Tay Ho | Ha Noi | 0888999888 |
2 | Nguyen Van B | Quan 5 | Ho Chi Minh | 0988988988 |
3 | Nguyen Van C | Quan 7 | Ho Chi Minh | 0899899899 |
4 | Nguyen Van D | Bac Tu Liem | Ha Noi | 0788788788 |
5 | Nguyen Van E | Ngo Quen | Hai Phong | 0858585858 |
6 | Nguyen Van F | Ngu Hanh Son | Da Nang | 0969696969 |
7 | Nguyen Van G | Tay Ho | Ha Noi | 0838383838 |
Câu lệnh SQL dưới đây, sử dụng mệnh đề SELF JOIN trong bảng KhachHang trên để lấy ra các tên khách hàng (TenKH1, TenKH2) có thành phố là trùng nhau hoặc có thể hiểu là các khách hàng có cùng thành phố với nhau. Tuy nhiên, các thành phố chỉ có 1 khách hàng sẽ không được lấy ra:
SELECT A.TenKH AS TenKH1, B.TenKH AS TenKH2, A.ThanhPho FROM KhachHang A, KhachHang B WHERE A.ID <> B.ID AND A.ThanhPho = B.ThanhPho ORDER BY A.ThanhPho;
Kết quả:
TenKH1 | TenKH2 | ThanhPho |
Nguyen Van G | Nguyen Van A | Ha Noi |
Nguyen Van G | Nguyen Van D | Ha Noi |
Nguyen Van A | Nguyen Van G | Ha Noi |
Nguyen Van A | Nguyen Van D | Ha Noi |
Nguyen Van D | Nguyen Van G | Ha Noi |
Nguyen Van D | Nguyen Van A | Ha Noi |
Nguyen Van B | Nguyen Van C | Ho Chi Minh |
Nguyen Van C | Nguyen Van B | Ho Chi Minh |