O erro de sintaxe aqui é que você precisa de um
on
-clause para sua left join
. Mas o problema conceitual subjacente é diferente:você não pode join
com uma subconsulta dependente . Você pode corrigir sua consulta assim:
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;
Isso moveu seu
where
interno -condition (que dependeria de items.id
, o que não é permitido, pois está fora do escopo) para o on
-cláusula. Assim, item_id
também é adicionado no select
interno (como é necessário fora). Uma maneira diferente de escrever isso seria
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Aqui você tem uma subconsulta dependente :o
where
interno -clause depende do items.id
externo . Você não precisa de um group by
mais, como o where
-condition já usa apenas as linhas desse item. (E você também só pode retornar no máximo uma linha neste contexto.) Ambas as consultas são equivalentes e podem (se o otimizador encontrar esse plano de execução) internamente ser executada exatamente da mesma maneira (o que não é nada com que você precise se preocupar muito, desde que você forneça índices apropriados).
Então, no seu caso, você pode usar os dois (e talvez verificar qual deles é mais rápido); se você quiser obter informações adicionais para esse item, você deve preferir a
left join
-versão, por exemplo, usar ...
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;