【问题标题】:Select from subquery and join on subquery in Esqueleto从子查询中选择并加入 Esqueleto 中的子查询
【发布时间】:2017-11-06 22:28:59
【问题描述】:

如何在 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

【问题讨论】:

  • 您尝试了哪些方法,为什么没有成功?你只是在找this function吗?
  • 我没有立刻意识到这一点,但是除了sub_select,还有subList_select
  • @user2407038 返回一个SqlExpr,并且仅限于单行值。这行不通。
  • @JezenThomas subList_select 也返回一个 SqlExpr。也不行。

标签: haskell esqueleto


【解决方案1】:

我来到这里是因为我有同样的问题。我想我们想要的东西是这样的:

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。最简单的方法是将其更改为对两个操作数都使用StringText,但这不是非常安全的。我不确定实现该类型安全的最佳选择是什么。

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

【讨论】:

  • 最好提出这个here
  • @JezenThomas 我认为他们已经意识到功能上的巨大差距。检查您的链接时,我发现了issue #32issue #70。这涵盖了这里提出的需求。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2016-01-28
  • 2012-02-13
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多