1

我有以下查询

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

这给了我以下错误

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

EXEC sp_executesql N'SELECT TOP (10) [__rnt].* FROM (SELECT ROW_NUMBER() OVER (ORDER BY type ASC) AS [__rn], first_name, created_at FROM Users GROUP BY first_name ) AS [_ rnt] WHERE [ _rnt] .[_ rn] > (10) 按 [ _rnt].[__rn] ASC' 排序

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

EXEC sp_executesql N'SELECT TOP (10) [__rnt].* FROM (SELECT ROW_NUMBER() OVER (ORDER BY type ASC) AS [__rn], first_name, created_at FROM [Users] GROUP BY first_name ) AS [_ rnt] WHERE [ _rnt].[_ rn] > (10) 按 [ _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-adapter-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
4

0 回答 0