L'erreur de syntaxe ici est que vous avez besoin d'un on
-clause pour votre left join
. Mais le problème conceptuel sous-jacent est différent :vous ne pouvez pas join
avec une sous-requête dépendante .
Vous pouvez corriger votre requête comme ceci :
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;
Cela a déplacé votre where
intérieur -condition (qui dépendrait de items.id
, ce qui n'est pas autorisé, car il est hors de portée) au on
-clause. Ainsi item_id
est également ajouté dans le select
interne (car il est nécessaire à l'extérieur).
Une autre façon d'écrire cela serait
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Ici, vous avez une sous-requête dépendante :le where
intérieur -clause dépend du items.id
externe . Vous n'avez pas besoin d'un group by
plus, comme le where
-condition utilise déjà uniquement les lignes de cet élément. (Et vous ne pouvez de toute façon renvoyer qu'une seule ligne au maximum dans ce contexte.)
Les deux requêtes sont équivalentes et peuvent (si l'optimiseur trouve ce plan d'exécution) être exécutées en interne exactement de la même manière (ce qui ne vous préoccupe pas beaucoup, tant que vous fournissez les index appropriés).
Donc, dans votre cas, vous pouvez utiliser les deux (et peut-être vérifier lequel est le plus rapide); si vous souhaitez obtenir des informations supplémentaires pour cet élément, vous devez préférer la left join
-version cependant, par ex. utiliser
...
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;