加入时的限制和偏移

时间:2014-11-25 08:50:00

标签: ruby-on-rails oracle oracle11g rails-activerecord

我有一个计划任务,用于同步来自外部源(Db Oracle 11g)的数据。

以下是我成功执行的查询。

   Partner.select("addresses.*, partners.*").joins(:address).where('existing=1)

现在,我想通过设置限制和偏移量来拆分此请求:

   Partner.select("addresses.*, partners.*").joins(:address).where('existing=1').limit(100).offset(100)

这是由活动记录生成的查询和错误:

   SELECT * FROM (
     SELECT raw_sql_.*, rownum raw_rnum_
     FROM (
      SELECT  ADDRESSES.*, PARTNERS.* 
      FROM PARTNERS INNER JOIN ADDRESSES 
      ON ADDRESSES.ID = PARTNERS.ID  
      WHERE (EXISTING=1)
     ) raw_sql_
     WHERE rownum <= 200
    )
    WHERE raw_rnum_ > 100

ActiveRecord::StatementInvalid: Java::JavaSql::SQLSyntaxErrorException: ORA-00918: column ambiguously defined

注意:使用kaminari完全相同的错误(显然):

   Partner.select("addresses.*, partners.*").joins(:address).where('existing=1').page(1)

3 个答案:

答案 0 :(得分:0)

此错误是由于select子句中列名重复造成的。你必须指定 table_name.column_name在where子句中,如

Partner.select("addresses.*, partners.*").joins(:address).where('table_name.existing=1').page(1)

答案 1 :(得分:0)

我认为oracle适配器与ActiveRecord的连接存在问题。

请查看以下文件配置

文件:lib / active_record / connection_adapters / oracle_enhanced_adapter.rb

    def explain(arel, binds = [])
      sql = "EXPLAIN PLAN FOR #{to_sql(arel)}"
      return if sql =~ /FROM all_/
      exec_query(sql, 'EXPLAIN')
      if ORACLE_ENHANCED_CONNECTION == :jdbc
       exec_query(sql, 'EXPLAIN', binds)
     else
       exec_query(sql, 'EXPLAIN')
     end
     select_values("SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)", 'EXPLAIN').join("\n")
    end

如果没有更改,您的文件具有与上面相同的配置,则ActiveRecored查询应该存在问题。

您可以查看参考Ambiguous column query

另一种解决方案 Rails / Active Record find with join, limit and offset

希望这可以帮助您解决问题:)

答案 2 :(得分:0)

您必须指定“现有”列所属的表。

此外,您无需指定partners.*。默认情况下,:joins方法选择partners表中的所有列。

我不确定你为什么在那里添加addresses.*,因为joins没有将连接表的列(即地址在这里)提取到内存中。

尽管如此,假设现有列属于'partners'表,这应该有效:

Partner.joins(:address).where("partners.existing = 1").limit(100).offset(100)

希望这会有所帮助:)