TinyTDS:offset从select中删除聚合函数

时间:2013-11-26 19:18:48

标签: ruby-on-rails ruby sql-server tiny-tds

我有以下查询

User.select('first_name, MAX(created_at)').group(:first_name).order(:first_name).offset(10)

这给了我以下错误

  

TinyTds ::错误:列'User.created_at'在选择列表中无效   因为它不包含在聚合函数或   GROUP BY子句:

     

EXEC sp_executesql N'SELECT TOP(10)[__ rnt]。* FROM(SELECT   ROW_NUMBER()OVER(ORDER BY类型ASC)AS [__ rn],first_name,   created_at FROM Users GROUP BY first_name)AS [_ rnt] WHERE   [ _rnt]。[_ rn]> (10)ORDER BY [ _rnt]。[__ rn] ASC'

     

ActiveRecord :: StatementInvalid:TinyTds :: Error:Column   “User.created_at”在选择列表中无效,因为它不是   包含在聚合函数或GROUP BY子句中。:

     

EXEC sp_executesql N'SELECT TOP(10)[__ rnt]。* FROM(SELECT   ROW_NUMBER()OVER(ORDER BY类型ASC)AS [__ rn],first_name,   created_at FROM [Users] GROUP BY first_name)AS [_ rnt] WHERE   [ _rnt]。[_ rn]> (10)ORDER BY [ _rnt]。[__ rn] ASC'

为什么在created_at?

上没有MAX的情况下生成上述查询

当我在没有offset的情况下运行相同的查询时,一切都很好。以下查询运行正常,它在created_at

上保留MAX
User.select('first_name, MAX(created_at)').group(:first_name).order(:first_name)

此外,这只是sql server的问题。如果我在postgres或mysql中运行相同的,它可以正常工作。

这是TinyTDS的已知问题吗?我该如何解决这个问题?

更新

我发现线条导致了我的问题

lib/arel/visitors/sqlserver.rb(line 373)(ActiveRecord的-SQLSERVER适配器-3.2.10)

# TODO: We use this for grouping too, maybe make Grouping objects vs SqlLiteral.
  def projection_without_expression(projection)
    Arel.sql(visit(projection).split(',').map do |x|
      x.strip!
      x.sub!(/^(COUNT|SUM|MAX|MIN|AVG)\s*(\((.*)\))?/,'\3')
      x.sub!(/^DISTINCT\s*/,'')
      x.sub!(/TOP\s*\(\d+\)\s*/i,'')
      x.strip
    end.join(', '))
  end

0 个答案:

没有答案