ự khác biệt giữa CROSS JOIN LATERAL và LEFT JOIN LATERAL trong PostgreSQL là gì?

NI
niemdauchomha
Junior

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ểmLEFT JOIN LATERALCROSS JOIN LATERAL
Khi truy vấn con rỗngGiữ 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ấtGiống như LEFT JOIN.Giống như INNER JOIN.
Cú pháp thường dùngBắ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.

Đời là bể khổ