Синтактичната грешка тук е, че имате нужда от on
-клауза за вашето left join
. Но основният концептуален проблем е различен:не можете да join
с зависима подзаявка .
Можете да коригирате заявката си по следния начин:
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;
Това премести вашето вътрешно where
- условие (което ще зависи от items.id
, което не е разрешено, тъй като е извън обхвата) към on
-клауза. Така item_id
също се добавя във вътрешния select
(както е необходимо навън).
Друг начин да напишете това би бил
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Тук имате зависима подзаявка :вътрешното where
-клауза зависи от външния items.id
. Не се нуждаете от group by
вече, като where
- условието вече използва само редовете за този елемент. (И така или иначе можете да върнете най-много един ред в този контекст.)
И двете заявки са еквивалентни и могат (ако оптимизаторът открие този план за изпълнение) вътрешно да се изпълняват по абсолютно същия начин (което обаче не е нещо, за което трябва да се интересувате особено, стига да предоставите подходящи индекси).
Така че във вашия случай можете да използвате и двете (и може би да проверите кой е по-бърз); ако искате да получите допълнителна информация за този елемент, трябва да предпочетете left join
-версия обаче, напр. използвайте
...
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;