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;