ここでの構文エラーは、onが必要なことです。 -left joinの句 。しかし、根本的な概念上の問題は異なります。joinすることはできません。 依存サブクエリ 。
次のようにクエリを修正できます:
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;
これにより、内部のwhereが移動しました -条件(items.idに依存します 、これは範囲外であるため許可されていません)on -句。したがって、item_id 内側のselectにも追加されます (外部で必要になるため)
これを書く別の方法は
ですselect items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
ここに依存サブクエリがあります :内側のwhere -句は外部のitems.idに依存します 。 group byは必要ありません もう、whereとして -conditionは、すでにそのアイテムの行のみを使用しています。 (とにかく、このコンテキストでは最大で1行しか返すことができません。)
両方のクエリは同等であり、(オプティマイザがその実行プランを検出した場合)内部的にまったく同じ方法で実行できます(適切なインデックスを提供する限り、これはあまり気にする必要はありません)。
したがって、あなたの場合は両方を使用できます(そして、どちらが速いかを確認することもできます)。そのアイテムの追加情報を取得したい場合は、left joinを選択する必要があります -バージョンですが、例:使用
...
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;