Lỗi cú pháp ở đây là bạn cần on
-từ bỏ cho left join
. Nhưng vấn đề khái niệm cơ bản thì khác:bạn không thể join
với một truy vấn phụ phụ thuộc .
Bạn có thể sửa truy vấn của mình như sau:
select items.*
from items
LEFT OUTER JOIN (
select item_id, sum(purchase_details.quantity) as total
from purchase_details
GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;
Điều này đã di chuyển where
-điều kiện (điều đó sẽ phụ thuộc vào items.id
, không được phép, vì nó nằm ngoài phạm vi) đối với on
-cảm ơn. Vì vậy, item_id
cũng được thêm vào select
bên trong (vì nó là cần thiết bên ngoài).
Một cách khác để viết điều này sẽ là
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Ở đây bạn có một truy vấn phụ phụ thuộc :where
-clause phụ thuộc vào items.id
bên ngoài . Bạn không cần nhóm group by
nữa, là where
-condition đã chỉ sử dụng các hàng cho mục đó. (Và dù sao thì bạn cũng chỉ có thể trả về nhiều nhất một hàng trong ngữ cảnh này.)
Cả hai truy vấn đều tương đương nhau và có thể (nếu trình tối ưu hóa tìm thấy kế hoạch thực thi đó) trong nội bộ thực sự được thực thi theo cùng một cách (mặc dù vậy, điều này không có gì bạn phải quan tâm, miễn là bạn cung cấp các chỉ mục phù hợp).
Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng cả hai (và có thể kiểm tra xem cái nào nhanh hơn); nếu bạn muốn có thêm thông tin cho mục đó, bạn nên chọn left join
-version mặc dù, ví dụ:sử dụng
...
LEFT OUTER JOIN (
select item_id,
sum(purchase_details.quantity) as total,
count(purchase_details.item_id) as cnt,
max(purchase_details.quantity) as max_quantity_per_order,
max(purchase_details.date) as latest_order,
...
from purchase_details
GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;