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