Rails Where子句PG :: SyntaxError:错误:子查询必须只返回一列

时间:2015-05-06 00:54:56

标签: ruby-on-rails postgresql

我想利用自定义sql查询的rails scoping。您可以点击此帖子,我正在尝试 - 特别是在ActiveAdmin中。

How to use a find_by_sql query for an ActiveAdmin index page?

基本上我正在尝试做这样的事情

class YourModel < ActiveRecord::Base
  scope :my_scope, where('some custom SQL')
  scope :my_other_scope, where('some other custom SQL')
end

这是我在Rails C

中首先尝试的查询
LesleyGrade.where('select distinct STC_TERM_GPA,
    TERM,
    last,
    first
    from lesley_grades
order by first, term ASC')

本质上,它是where子句中的子查询。我只想为每个人每行返回一个不同的STC_TERM_GPA。

这些是lesley_grades表中的属性,可能有助于理解我正在尝试检索的信息。

id
user_id
lesley_id
last
first
active
site
cohort
section
sections_title
faculty
completed_term_cred
term
sec_start_date
sec_end_date
grade
stc_cred
active_program
most_recent_program
intent_filed
stc_term_gpa
sta_cum_gpa
start_term
prog_status
last_change_date
created_at
updated_at

所以我想先看看这是否适用于Rails C,这就是我所得到的。

  LesleyGrade Load (51.1ms)  SELECT "lesley_grades".* FROM "lesley_grades"  WHERE (select distinct STC_TERM_GPA,
    TERM,
    last,
    first
    from lesley_grades
order by first, term ASC)
PG::SyntaxError: ERROR:  subquery must return only one column
LINE 1: ...ECT "lesley_grades".* FROM "lesley_grades"  WHERE (select di...
                                                             ^
: SELECT "lesley_grades".* FROM "lesley_grades"  WHERE (select distinct STC_TERM_GPA,
    TERM,
    last,
    first
    from lesley_grades
order by first, term ASC)
=> #<LesleyGrade::ActiveRecord_Relation:0x3fcb44d60944>

我不确定如何修复

PG::SyntaxError: ERROR:  subquery must return only one column

1 个答案:

答案 0 :(得分:1)

不确定你想要实现什么,但是这样的事情至少应该解决你所看到的postgres错误:

LesleyGrade.where('STC_TERM_GPA IN 
    (SELECT STC_TERM_GPA FROM 
        (SELECT DISTINCT STC_TERM_GPA, TERM, last, first
        FROM lesley_grades
        order by first, term ASC) AS results
    )'
)

那里有几个层次:

最深层次说“给我所有行具有明显/唯一的列组合 STC_TERM_GPA,TERM,last和first

下一层说“在那些结果中,摆脱其他列,只给我 STC_TERM_GPA 列。

最外层说“给我所有 STC_TERM_GPA 值的行都在我们刚刚选择的 STC_TERM_GPA 的集合中。

编辑:听起来你根本不是WHERE条款。你想要这样的东西:

LesleyGrade.select('STC_TERM_GPA, TERM, last, first').group('STC_TERM_GPA').order('first, term ASC')

那是未经测试的。但是要选择多个列,但限制为一列的不同值,您将需要使用SQL的GROUP BY子句,该子句可通过ActiveRecord方法在Rails'group中使用。 / p>

BTW,select distinct STC_TERM_GPA, TERM, last, first from lesley_grades order by first, term ASC会为您提供STC_TERM_GPA, TERM, last, first组合中唯一的结果,而不是JUST STC_TERM_GPA。我假设你想要所有这些列,你只需要STC_TERM_GPA上的DISTINCT。