De syntaxisfout hier is dat je een on
. nodig hebt -clause voor je left join
. Maar het onderliggende conceptuele probleem is anders:je kunt niet join
met een afhankelijke subquery .
U kunt uw vraag als volgt oplossen:
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;
Dit bracht je innerlijke where
-condition (dat zou afhangen van items.id
, wat niet is toegestaan, omdat het buiten het bereik valt) naar de on
-clausule. Dus item_id
is ook toegevoegd in de binnenste select
(omdat het buiten nodig is).
Een andere manier om dit te schrijven zou zijn
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Hier heb je een afhankelijke subquery :de binnenste where
-clausule hangt af van de buitenste items.id
. Je hebt geen group by
nodig niet meer, zoals de where
-condition gebruikt al alleen de rijen voor dat item. (En je kunt in deze context sowieso maar maximaal één rij retourneren.)
Beide query's zijn equivalent en kunnen (als de optimizer dat uitvoeringsplan vindt) intern op precies dezelfde manier worden uitgevoerd (waar u echter niet veel om hoeft te geven, zolang u de juiste indexen opgeeft).
Dus in jouw geval kun je beide gebruiken (en misschien controleren welke sneller is); als je aanvullende informatie voor dat item wilt krijgen, geef dan de voorkeur aan de left join
-versie echter, b.v. gebruik
...
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;