El error de sintaxis aquí es que necesita un on
-cláusula para su left join
. Pero el problema conceptual subyacente es diferente:no puedes join
con una subconsulta dependiente .
Puede corregir su consulta de esta manera:
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;
Esto movió tu interior where
-condición (que dependería de items.id
, que no está permitido, ya que está fuera del alcance) al on
-cláusula. Así item_id
también se agrega en el interior select
(ya que se necesita afuera).
Una forma diferente de escribir esto sería
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Aquí tienes una subconsulta dependiente :el interior where
-la cláusula depende del items.id
externo . No necesitas un group by
más, como el where
-condition ya usa solo las filas para ese artículo. (Y también puede devolver como máximo una fila en este contexto de todos modos).
Ambas consultas son equivalentes y pueden (si el optimizador encuentra ese plan de ejecución) internamente ejecutarse exactamente de la misma manera (que no es nada que deba preocuparse mucho, siempre que proporcione los índices apropiados).
Entonces, en su caso, puede usar ambos (y tal vez verificar cuál es más rápido); si desea obtener información adicional para ese elemento, debe preferir la left join
-versión sin embargo, p. 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;