此处的语法错误是您需要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
-condition(这将取决于items.id
,这是不允许的,因为它超出范围)的on
-clause 。因此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
-clause依赖于外items.id
。您不再需要group by
,因为where
条件已经只使用该项目的行。 (而且在这种情况下,您最多也只能返回一行。)
这两个查询都是等价的,并且可以(如果优化程序发现执行计划)在内部实际上以完全相同的方式执行(这不是什么尽管如此,只要您提供适当的索引,您就必须关心很多)。
所以在你的情况下,你可以同时使用(也许检查哪一个更快);如果你想获得该物品的其他信息,你应该更喜欢left join
-version,尽管如此。使用
...
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;
您的查询没有“LIMIT”关键字(在错误消息中提及),您可以发布完整查询吗? –
该错误与您的代码不符。重写你的问题,或者你的代码,或者你的错误......或者所有的东西 – nacho
你没有指定你想要加入的领域是整个选择阶段?另外你只有在你的联合子查询中有总和字段?也许你需要添加Item_ID? – Learning