sql - 带有左外连接的 Postgresql COUNT() 值不正确
问题描述
在 postgresql 9.3 中使用 LEFT OUTER JOIN 时,我遇到了计数聚合问题。
当我在没有左外连接的情况下执行标准语句时,它返回正确的计数,在本例中为 3。当语句变得更复杂时,如下面的语句,它返回 7 而不是不正确的。
只有一些 count() 聚合不正确,其中大多数是正确的。这是什么原因造成的?我应该使用不同的联接吗?
SELECT country_code,
period,
COUNT(commissions.id) AS count,
SUM(commissions.total) AS total,
SUM(CASE WHEN commission_adjustments.is_bonus is True THEN commission_adjustments.total else 0 END) AS bonus
FROM commissions
LEFT OUTER JOIN commission_adjustments ON commissions.id = commission_adjustments.commission_id
GROUP BY commissions.country_code, commissions.period
ORDER BY commissions.country_code, commissions.period
解决方案
如果你有这个:
SELECT * FROM table
id, x
1, 'foo'
2, 'foo'
3, 'foo'
SELECT x, COUNT(*) as ct FROM table GROUP BY x
x, ct
'foo', 3
它是“正确的”..
然后你这样做:
SELECT x, COUNT(*) as ct FROM table LEFT JOIN sometable ON table.x = sometable.y GROUP BY x
它突然“出错”:
x, ct
'foo', 7
这是因为有一个笛卡尔积;多行sometable
与此行匹配。删除分组/选择 * 并查看:
SELECT * FROM table LEFT JOIN sometable ON table.id = sometable.otherid --GROUP BY x
id, x, otherid
1, 'foo', 1
1, 'foo', 1
1, 'foo', 1
2, 'foo', 2
2, 'foo', 2
2, 'foo', 2
3, 'foo', null
7 行,由以下原因引起:
SELECT * FROM othertable
otherid
1
1
1
2
2
2
多于一行 fromothertable
匹配一行 intable
您需要限制您的连接,因此它不会导致这种行的倍增,或者可能在您进行连接之前将您的连接行分组到子查询中
如果突然不再需要所有行都匹配,则切换 JOIN 类型也可能导致出现更多行,但这不会影响您在左侧计算一个表并通过左连接添加另一个表的情况;只有笛卡尔积会在这里颠簸
推荐阅读
- android - 在哪里声明应用程序的所有活动中使用的变量和函数(Kotlin)
- r - 选择冲击大小并登录脉冲响应函数
- python-3.x - 有什么方法可以在 Python 中使用 SQLite 将变量用作添加列的名称?
- r - 我无法在 r 中的 for{} 中使用 tiff() 保存文件
- graph - SAS - 无论图例的大小和图形的大小如何,都可以在图形的同一位置使用注释显示文本?
- linq - linq查询返回带有回车的字符串
- php - 如何以原子方式加载新的并更新现有的 Eloquent 模型?
- php - 如何为 Stripe/PHP 指定 MOTO(邮购电话订单)?
- php - jquery wordpress 插件功能
- amazon-web-services - 如何关闭要求我按键盘上的 Q 的 AWS CLI(2) dynamodb 响应?(又名无声)