获取 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::Relation
个 SipTrunk
个对象。
如何获取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::Relation
个 SipTrunk
个对象。