在明显相似的代码上使用distinct()和count()方法的奇怪结果

时间:2015-09-30 17:37:54

标签: ruby-on-rails postgresql ruby-on-rails-4 rails-postgresql postgresql-9.4

Rails 4(Rails 4.2.2 / ruby​​ 2.2.1)和PostgreSQL 9(PostgreSQL 9.4.4)发现了以下奇怪的行为。

请记住,没有聚合表达式的分组会有效地计算列中不同值的集合,以下明显相似的代码行会导致奇怪和奇怪的结果:

为什么:

Item.select( :color, :size ).distinct.count  # ERROR

返回错误,而是:

Item.select( :color, :size ).distinct.count( :all )  # WRONG
Item.select( :color, :size ).distinct.count( :color, :size )  # WRONG

两者都返回错误的结果(如果有重复的记录具有相同的:color:size值)?

为什么:

Item.select( :color, :size ).group( :color, :size ).count  # ERROR

返回错误,而是:

Item.select( :color, :size ).group( :color, :size ).count( :all ).count

正确计算SELECT COUNT(DISTINCT (color, size)) FROM items

此外:

Item.group( :color, :size )  # ERROR

返回错误,正如预期的那样,因为带有GROUP BY子句的查询只能在SELECT列表中包含非聚合列引用,如果它们也出现在或在功能上依赖于, GROUP BY条款

但Rails允许以下内容:

Item.group( :color, :size ).count.count

也正确计算SELECT COUNT(DISTINCT (color, size)) FROM items

0 个答案:

没有答案