Błąd składni polega na tym, że potrzebujesz on -klauzula dla twojego left join . Ale podstawowy problem koncepcyjny jest inny:nie możesz join z zależnym podzapytaniem .
Możesz poprawić swoje zapytanie w ten sposób:
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;
To przeniosło twoje wewnętrzne where -stan (który będzie zależał od items.id , co jest niedozwolone, ponieważ jest poza zakresem) do on -klauzula. Zatem item_id jest również dodawany w wewnętrznym select (jak to jest potrzebne na zewnątrz).
Innym sposobem napisania tego byłoby
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Tutaj masz zależne podzapytanie :wewnętrzny where -klauzula zależy od zewnętrznego items.id . Nie potrzebujesz group by już, jako where -warunek używa już tylko wierszy dla tego elementu. (W tym kontekście możesz również zwrócić co najwyżej jeden wiersz).
Oba zapytania są równoważne i mogą (jeśli optymalizator znajdzie ten plan wykonania) wewnętrznie faktycznie wykonane w dokładnie ten sam sposób (co nie jest niczym, o co musisz się specjalnie przejmować, o ile zapewnisz odpowiednie indeksy).
Więc w twoim przypadku możesz użyć obu (i może sprawdzić, który z nich jest szybszy); jeśli chcesz uzyskać dodatkowe informacje o tym elemencie, powinieneś preferować left join - jednak wersja, np. użyj
...
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;