[英]Select from subquery and join on subquery in Esqueleto
如何在Esqueleto中select ... from (select ...) join (select ...)
?
我知道我可以使用Persistent中的rawSql
,但我想避免这种情况。
对于记录,这是完整的查询:
select q.uuid, q.upvotes, q.downvotes, count(a.parent_uuid), max(a.isAccepted) as hasAccepted
from
(select post.uuid, post.title, sum(case when (vote.type = 2) then 1 else 0 end) as upvotes, sum(case when (vote.type = 3) then 1 else 0 end) as downvotes
from post left outer join vote on post.uuid = vote.post_id
where post.parent_uuid is null
group by post.uuid
order by post.created_on desc
) q
left outer join
(select post.parent_uuid, max(case when (vote.type = 1) then 1 else 0 end) as isAccepted
from post left outer join vote on post.uuid = vote.post_id
where post.parent_uuid is not null
group by post.id
) a
on a.parent_uuid = q.uuid
group by q.uuid
limit 10
我来到这里因为我有同样的问题。 我想我们想要的东西是这样的:
fromSelect
:: ( Database.Esqueleto.Internal.Language.From query expr backend a
, Database.Esqueleto.Internal.Language.From query expr backend b
)
=> (a -> query b)
-> (b -> query c)
-> query c
不幸的是,从查看Database.Esqueleto.Internal.Sql .FromClause:
-- | A part of a @FROM@ clause.
data FromClause =
FromStart Ident EntityDef
| FromJoin FromClause JoinKind FromClause (Maybe (SqlExpr (Value Bool)))
| OnClause (SqlExpr (Value Bool))
我不认为在Esqueleto有任何支持。 它似乎只支持简单的表名和连接与具有布尔表达式的on子句。 我想最难添加支持的是处理表和列名别名( as
sql子句),因为^.
期望expr (Entity val)
和EntityField val typ
。 最简单的方法是将其更改为对两个操作数使用String
或Text
,但这不是非常类型安全的。 我不确定什么样的最佳选择才能使该类型安全。
编辑:可能最好忘记^.
并且在提供其第一个参数的返回值作为其第二个参数的参数时,使用fromSelect
生成别名。 可能必须更改类型以为这些别名腾出空间。 这只是考虑from
子查询,而不是连接。 那是另一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.