Tóm tắt
CROSS JOIN tạo tích Descartes (mọi cặp hàng từ 2 tập). Bài viết示范 tìm các cặp (UserName, UserRelationshipName) **chưa tồn tại** trong bảng.
Ví dụ
1. Tạo bảng
CREATE TABLE PairDemo (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserName VARCHAR(20),
UserRelationshipName VARCHAR(20)
);
2. Dữ liệu
INSERT INTO PairDemo (UserName, UserRelationshipName) VALUES
('John', 'James'), ('Carol', 'James'), ('Carol', 'David'), ('Sam', 'David');
3. CROSS JOIN + NOT EXISTS
SELECT U.UserName, UR.UserRelationshipName
FROM (
(SELECT DISTINCT UserName FROM PairDemo) U
CROSS JOIN
(SELECT DISTINCT UserRelationshipName FROM PairDemo) UR
)
WHERE NOT EXISTS (
SELECT * FROM PairDemo T
WHERE T.UserName = U.UserName
AND T.UserRelationshipName = UR.UserRelationshipName
);
4. Kết quả: Các cặp chưa có
+----------+----------------------+
| UserName | UserRelationshipName |
+----------+----------------------+
| Sam | James |
| John | David |
+----------+----------------------+
Giải thích
- Subquery U: danh sách tên duy nhất (John, Carol, Sam).
- Subquery UR: danh sách relationship duy nhất (James, David).
- CROSS JOIN → 3×2 = 6 cặp có thể.
- NOT EXISTS loại 4 cặp đã có trong bảng → còn 2 cặp thiếu.
Lưu ý hiệu năng
- CROSS JOIN tạo N×M hàng – cẩn thận với tập lớn.
- Dùng index trên (UserName, UserRelationshipName) để NOT EXISTS nhanh.
- Thay thế:
LEFT JOIN ... WHERE T.id IS NULL(anti-join) thường nhanh hơn NOT EXISTS.