ự khác biệt giữa CROSS JOIN LATERAL và LEFT JOIN LATERAL trong PostgreSQL là gì?
NI
niemdauchomha
Junior
05/10/2026 9 giờ 35 phút
Sự khác biệt cốt lõi nằm ở cách xử lý các dòng của bảng gốc (bên trái) khi truy vấn con LATERAL không tìm thấy dữ liệu khớp.
Đặc điểm
LEFT JOIN LATERAL
CROSS JOIN LATERAL
Khi truy vấn con rỗng
Giữ lại dòng của bảng bên trái. Các cột lấy từ truy vấn con sẽ bị gán giá trị NULL.
Loại bỏ hoàn toàn dòng của bảng bên trái khỏi kết quả cuối cùng.
Bản chất
Giống như LEFT JOIN.
Giống như INNER JOIN.
Cú pháp thường dùng
Bắt buộc phải có mệnh đề ON (thường viết là ON true).
Không cần mệnh đề ON.
Minh họa thực tế
Tiếp tục với ví dụ bảng users và orders. Giả sử hệ thống có User A (có 5 đơn hàng) và User B (chưa từng mua hàng).
1. LEFT JOIN LATERAL (Mục đích: Liệt kê mọi người dùng)
SELECT u.name, o.order_id
FROM users u
LEFT JOIN LATERAL (
SELECT order_id FROM orders WHERE user_id = u.id LIMIT 2
) o ON true;
Kết quả: Trả về 2 dòng cho User A (kèm mã 2 đơn hàng) và 1 dòng cho User B (kèm order_id là NULL).
2. CROSS JOIN LATERAL (Mục đích: Chỉ lấy những người có giao dịch
SELECT u.name, o.order_id
FROM users u
CROSS JOIN LATERAL (
SELECT order_id FROM orders WHERE user_id = u.id LIMIT 2
) o;
Kết quả: Trả về 2 dòng cho User A. User B bị loại bỏ hoàn toàn khỏi kết quả hiển thị vì bên trong khối LATERAL không trả về dòng nào.
Mẹo viết tắt: Trong PostgreSQL, nếu bạn viết dấu phẩy giữa hai bảng kèm từ khóa LATERAL (ví dụ: FROM users u, LATERAL (SELECT...)), database sẽ tự động hiểu đó chính là CROSS JOIN LATERAL.
Sự khác biệt cốt lõi nằm ở cách xử lý các dòng của bảng gốc (bên trái) khi truy vấn con LATERAL không tìm thấy dữ liệu khớp.
Minh họa thực tế
Tiếp tục với ví dụ bảng users và orders. Giả sử hệ thống có User A (có 5 đơn hàng) và User B (chưa từng mua hàng).
1. LEFT JOIN LATERAL (Mục đích: Liệt kê mọi người dùng)
Kết quả: Trả về 2 dòng cho User A (kèm mã 2 đơn hàng) và 1 dòng cho User B (kèm order_id là NULL).
2. CROSS JOIN LATERAL (Mục đích: Chỉ lấy những người có giao dịch
Kết quả: Trả về 2 dòng cho User A. User B bị loại bỏ hoàn toàn khỏi kết quả hiển thị vì bên trong khối LATERAL không trả về dòng nào.