为什么我不能在SQL中同时使用ORDER BY和DISTINCT *?

时间:2014-09-14 01:28:55

标签: ruby-on-rails sql-server rails-activerecord

我试图做以下事情,如果我要取消注释,它会破坏。此外,如果我注释掉订单并留下明确的内容,它将会起作用。

Contestant.joins('INNER JOIN votes AS V ON V.contestant_id = contestants.id AND V.season_id = '+ season_number.to_s)
                      .joins('LEFT OUTER JOIN votes AS XV ON (XV.contestant_id = '+self.id.to_s+') AND (XV.tribal_council_key = V.tribal_council_key) AND XV.contestant_voted_for_id = V.contestant_voted_for_id')
                      .joins('INNER JOIN season_rosters ON season_rosters.season_id = V.season_id')
                      .where('V.is_jury_vote = (?) AND V.contestant_id <> (?) AND XV.tribal_council_key IS NOT NULL', :false, self.id)
                      .order('season_rosters.finished')
                      #.distinct

我得到的错误是......

TinyTds::Error: Incorrect syntax near '*'.: EXEC sp_executesql N'SELECT DISTINCT *, __order FROM ( SELECT [contestants].*, DENSE_RANK() OVER (ORDER BY season_rosters.finished ASC) AS __order, ROW_NUMBER() OVER (PARTITION BY [contestants].* ORDER BY season_rosters.finished ASC) AS __joined_row_num FROM [contestants] INNER JOIN votes AS V ON V.contestant_id = contestants.id AND V.season_id = 6 LEFT OUTER JOIN votes AS XV ON (XV.contestant_id = 112) AND (XV.tribal_council_key = V.tribal_council_key) AND XV.contestant_voted_for_id = V.contestant_voted_for_id INNER JOIN season_rosters ON season_rosters.season_id = V.season_id WHERE (V.is_jury_vote = (''false'') AND V.contestant_id <> (112) AND XV.tribal_council_key IS NOT NULL) ) AS __sq WHERE __joined_row_num = 1 ORDER BY __order'

1 个答案:

答案 0 :(得分:0)

问题出在这一部分:

SELECT DISTINCT *, __order

尝试将所需的列添加到GROUP BY。

Contestant.joins('INNER JOIN votes AS V ON V.contestant_id = contestants.id AND V.season_id = '+ season_number.to_s)
                      .joins('LEFT OUTER JOIN votes AS XV ON (XV.contestant_id = '+self.id.to_s+') AND (XV.tribal_council_key = V.tribal_council_key) AND XV.contestant_voted_for_id = V.contestant_voted_for_id')
                      .joins('INNER JOIN season_rosters ON season_rosters.season_id = V.season_id')
                      .where('V.is_jury_vote = (?) AND V.contestant_id <> (?) AND XV.tribal_council_key IS NOT NULL', :false, self.id)
                      .order('season_rosters.finished')
                      .group('col1,col2,__order')

同样在您的SQL错误中,排序依据在代码中的其他列上,它位于season_rosters.finished上。