Vấn đề: INSERT INTO SELECT từ 2 bảng nguồn (tạo tổ hợp Cartesian product)
Bảng 1: Tên (Chris, Robert). Bảng 2: Tuổi (23, 26). Cần chèn vào bảng 3 tất cả tổ hợp (Chris-23, Chris-26, Robert-23, Robert-26).
Giải pháp: INSERT INTO ... SELECT FROM table1, table2 (Implicit CROSS JOIN)
Liệt kê nhiều bảng trong FROM cách nhau bởi dấu phẩy = CROSS JOIN (tích Descartes).
1. Tạo 3 bảng
CREATE TABLE Names (Name VARCHAR(20));
INSERT INTO Names VALUES ('Chris'), ('Robert');
CREATE TABLE Ages (Age INT);
INSERT INTO Ages VALUES (23), (26);
CREATE TABLE Students (StudentName VARCHAR(20), StudentAge INT);
2. Chèn tổ hợp từ 2 bảng
INSERT INTO Students (StudentName, StudentAge)
SELECT tbl1.Name, tbl2.Age
FROM Names tbl1, Ages tbl2;
3. Kết quả (4 hàng = 2x2)
+-------------+------------+
| StudentName | StudentAge |
+-------------+------------+
| Chris | 23 |
| Robert | 23 |
| Chris | 26 |
| Robert | 26 |
+-------------+------------+
Giải thích
FROM Names tbl1, Ages tbl2– Tích Descartes: mỗi hàng của Names ghép với mỗi hàng của Ages.- Kết quả:
N x Mhàng (N = số hàng Names, M = số hàng Ages). - Tương đương
FROM Names CROSS JOIN Ages(cú pháp rõ ràng hơn).
Cảnh báo
- Rất dễ tạo ra lượng dữ liệu khổng lồ vô tình (ví dụ 10.000 x 10.000 = 100 triệu hàng).
- Luôn kiểm tra số hàng trước:
SELECT COUNT(*) FROM Names, Ages;. - Nếu cần ghép theo khóa (JOIN có điều kiện), dùng
INNER JOIN ... ON ....
Ứng dụng
- Tạo dữ liệu test tổ hợp (parameterized test).
- Khởi tạo bảng cấu hình (mọi user x mọi role).
- Ma trận báo cáo.