ここでの構文エラーは、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;