我有以下查询
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