Chyba syntaxe je, že potřebujete on
-klauzule pro vaše left join
. Ale základní koncepční problém je jiný:nemůžete se join
s závislým poddotazem .
Svůj dotaz můžete opravit takto:
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;
Toto přesunulo vaše vnitřní where
-condition (to by záviselo na items.id
, což není povoleno, protože je mimo rozsah) do on
-doložka. Tedy item_id
je také přidán do vnitřního select
(jak je potřeba venku).
Jiný způsob, jak to napsat, by byl
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Zde máte závislý poddotaz :vnitřní where
-klauzule závisí na vnějším items.id
. Nepotřebujete group by
již jako where
-condition již používá pouze řádky pro danou položku. (A v tomto kontextu také můžete vrátit maximálně jeden řádek.)
Oba dotazy jsou ekvivalentní a mohou být (pokud optimalizátor nalezne tento plán provádění) interně skutečně provedeny přesně stejným způsobem (což není nic, o co byste se museli moc starat, pokud poskytnete vhodné indexy).
Takže ve vašem případě můžete použít oba (a možná zkontrolovat, který z nich je rychlejší); pokud chcete získat další informace o této položce, měli byste preferovat left join
-verze však např. použití
...
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;