Der Syntaxfehler hier ist, dass Sie einen on
benötigen -Klausel für Ihren left join
. Aber das zugrunde liegende konzeptionelle Problem ist anders:Sie können nicht join
mit einer abhängigen Unterabfrage .
Sie können Ihre Abfrage wie folgt korrigieren:
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;
Dies hat Ihr inneres where
verschoben -condition (das würde von items.id
abhängen , was nicht erlaubt ist, da es außerhalb des Gültigkeitsbereichs liegt) an on
-Klausel. Also item_id
wird auch im inneren select
hinzugefügt (wie es draußen benötigt wird).
Eine andere Schreibweise wäre
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
Hier haben Sie eine abhängige Unterabfrage :das innere where
-Klausel hängt von der äußeren items.id
ab . Sie benötigen kein group by
nicht mehr als where
-condition verwendet bereits nur die Zeilen für dieses Element. (Und Sie können in diesem Kontext sowieso nur höchstens eine Zeile zurückgeben.)
Beide Abfragen sind äquivalent und können (wenn der Optimierer diesen Ausführungsplan findet) intern tatsächlich auf genau die gleiche Weise ausgeführt werden (worum Sie sich jedoch nicht viel kümmern müssen, solange Sie geeignete Indizes bereitstellen).
In Ihrem Fall können Sie also beide verwenden (und vielleicht prüfen, welches schneller ist); wenn Sie zusätzliche Informationen zu diesem Artikel erhalten möchten, sollten Sie den left join
bevorzugen -Version aber, z.B. verwenden
...
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;