【发布时间】:2015-01-04 03:50:54
【问题描述】:
考虑这个查询:
select
count(p.id),
count(s.id),
sum(s.price)
from
(select * from orders where <condition>) as s,
(select * from products where <condition>) as p
where
s.id = p.order;
例如,产品中有 200 条记录,订单中有 100 条记录(一个订单可以包含一个或多个产品)。
我需要加入然后然后:
- 计数产品(应返回 200)
- 计数订单(应返回 100)
- 按订单字段之一求和(应返回按 100 个价格计算的总和)
问题是加入后 p 和 s 长度相同,对于 2) 我可以写 count(distinct s. id),但是对于 3) 我得到了重复(例如,如果销售有 2 个产品,它会将价格加起来两次)所以 sum 适用于整个 200 条记录集,但应该只查询100.
有什么想法如何总结连接表中的不同记录而不破坏另一个选择?
例如,连接表有
id sale price
0 0 4
0 0 4
1 1 3
2 2 4
2 2 4
2 2 4
所以 sum(s.price) 将返回:
4+4+3+4+4+4=23
但我需要:
4+3+4=11
【问题讨论】:
-
如果您添加示例数据和预期输出,它会更加清晰
-
为什么“产品”表中会有
orderid? -
@Gordon Linoff:这正是我的想法。令人困惑。
-
抱歉,解释不清楚。当然,这个示例被简化了很多,两个表中还有很多其他字段。我不想增加问题的开销。由于@ManyToOne 关系,产品引用了订单。
标签: sql postgresql select join