gpt4 book ai didi

haskell - 从子查询中选择并连接 Esqueleto 中的子查询

转载 作者:行者123 更新时间:2023-12-02 14:09:08 26 4
gpt4 key购买 nike

如何在 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来看.From子句:

-- | A part of a @FROM@ clause.
data FromClause =
FromStart Ident EntityDef
| FromJoin FromClause JoinKind FromClause (Maybe (SqlExpr (Value Bool)))
| OnClause (SqlExpr (Value Bool))

我认为 Esqueleto 对此没有任何支持。它似乎只支持简单的表名和带有 bool 表达式的 on 子句的连接。我想添加对此的支持最困难的部分是处理表和列名称别名(as sql 子句),因为 ^. 需要一个 expr (Entity val) EntityField val type。最简单的方法是将其更改为对两个操作数使用 StringText,但这不是非常类型安全的。我不确定实现该类型安全的最佳选择是什么。

编辑:可能最好忘记 ^. 并在提供第一个参数的返回值作为第二个参数的参数时让 fromSelect 生成别名。可能需要更改类型才能为这些别名腾出空间。这只是考虑from子查询,而不是连接。这是另一个问题。

关于haskell - 从子查询中选择并连接 Esqueleto 中的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47146909/

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