Kesalahan sintaks di sini adalah Anda memerlukan on
-klausa untuk left join
your . Tetapi masalah konseptual yang mendasarinya berbeda:Anda tidak dapat join
dengan subkueri dependen .
Anda dapat memperbaiki kueri Anda seperti ini:
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;
Ini memindahkan where
batin Anda -kondisi (tergantung pada items.id
, yang tidak diperbolehkan, karena di luar cakupan) ke on
-ayat. Jadi item_id
juga ditambahkan di dalam select
(karena dibutuhkan di luar).
Cara lain untuk menulis ini adalah
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Di sini Anda memiliki subquery dependen :bagian dalam where
-klausa tergantung pada items.id
luar . Anda tidak memerlukan group by
lagi, sebagai where
-kondisi sudah menggunakan hanya baris untuk item itu. (Dan Anda juga hanya dapat mengembalikan paling banyak satu baris dalam konteks ini.)
Kedua kueri tersebut setara, dan dapat (jika pengoptimal menemukan bahwa rencana eksekusi) secara internal benar-benar dieksekusi dengan cara yang persis sama (meskipun Anda tidak perlu terlalu peduli, selama Anda memberikan indeks yang sesuai).
Jadi dalam kasus Anda, Anda dapat menggunakan keduanya (dan mungkin memeriksa mana yang lebih cepat); jika Anda ingin mendapatkan informasi tambahan untuk item itu, Anda harus memilih left join
-versi sekalipun, mis. gunakan
...
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;