我有一个计划任务,用于同步来自外部源(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)
答案 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)
希望这会有所帮助:)