获取 ActiveRecord 中的 Union 所有结果

Obtain Union all result in ActiveRecord

如何获取Rails中的UNION运算结果。

鉴于我有以下 SQL 声明

SELECT  "sip_trunks".* FROM "sip_trunks" WHERE "sip_trunks"."default" = t LIMIT 1 UNION ALL SELECT  "sip_trunks".* FROM "sip_trunks" WHERE "sip_trunks"."default" = f LIMIT 1 

到目前为止,我已经成功地使用 AREL 和 union all 语句构建了 SQL。

SipTrunk.where(default: true).limit(1).union(:all,SipTrunk.where(default: false).limit(1))

但是试图查询这个结果和 AREL,即 Arel::Nodes::UnionAll,我无法获得数据库结果。

另外 运行 to_sql 在语句上产生一个 SQL 像这样..

( SELECT  "sip_trunks".* FROM "sip_trunks" WHERE "sip_trunks"."default" =  LIMIT 1 UNION ALL SELECT  "sip_trunks".* FROM "sip_trunks" WHERE "sip_trunks"."default" =  LIMIT 1 )

这似乎是一个准备好的语句,但我在数据库中没有看到任何准备好的语句

正在尝试使用上述 SQL 使用 find_by_sql

SipTrunk.find_by_sql(SipTrunk.where(default: true).limit(1).union(:all,SipTrunk.where(default: false).limit(1)).to_sql,[['default',true],['default',false]])

有以下错误

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "UNION"
LINE 1: ...trunks" WHERE "sip_trunks"."default" =  LIMIT 1 UNION ALL ...

如何从这里获取最后的 SQL 行?

您可以像这样执行 union,连接两个 sql 查询。

sql1 = SipTrunk.where(default: true).limit(1).to_sql
sql2 = SipTrunk.where(default: false).limit(1).to_sql

@sip_trunks = SipTrunk.find_by_sql("#{sql1} UNION #{sql2}")

如果你想成为新人或想加入多个 sql 查询,你可以加入这个

final_sql = [sql1, sql2].join(' UNION ')
@sip_trunks = SipTrunk.find_by_sql(final_sql)

下面是我将如何执行此操作。

sql1 = SipTrunk.where(default: true).limit(1).arel
sql2 = SipTrunk.where(default: false).limit(1).arel
subquery = Arel::Nodes::As.new(
 Arel::Nodes::UnionAll.new(sql1,sql2),
 SipTrunk.arel_table
) 
SipTrunk.from(subquery)

这将导致以下结果 SQL

SELECT 
  sip_trunks.*
FROM 
  ( SELECT 
      sip_trunks.* 
    FROM 
      sip_trunks
    WHERE 
      sip_trunks.default = t
    LIMIT 1
    UNION ALL 
    SELECT 
      sip_trunks.* 
    FROM 
      sip_trunks
    WHERE 
      sip_trunks.default = f
    LIMIT 1) AS sip_trunks

这将 return ActiveRecord::RelationSipTrunk 个对象。