gpt4 book ai didi

ruby-on-rails - 在 ActiveRecord 中获取 Union 所有结果

转载 作者:行者123 更新时间:2023-12-03 23:10:58 26 4
gpt4 key购买 nike

如何在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" = $1 LIMIT 1 UNION ALL SELECT  "sip_trunks".* FROM "sip_trunks" WHERE "sip_trunks"."default" = $2 LIMIT 1 )

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

尝试使用 find_by_sql 使用上述 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" = $1 LIMIT 1 UNION ALL ...

我如何从这里获取最终的 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

这将返回 ActiveRecord::RelationSipTrunk对象。

关于ruby-on-rails - 在 ActiveRecord 中获取 Union 所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com