首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Esqueleto组合查询/子选择?

如何使用Esqueleto组合查询/子选择?
EN

Stack Overflow用户
提问于 2015-09-03 16:01:56
回答 1查看 289关注 0票数 1

基于this answer,我得出结论,Esqueleto不允许使用left outer join组合两个查询。但是,我希望我的问题仍然有一个解决办法,在某个地方。

我想用一个额外受限的表做一个左外部连接。考虑一下我的第一种方法:

代码语言:javascript
复制
fetchFarmsByCity1 city = runDb . select . from $
  \(farm `LeftOuterJoin` pig) -> do
    on $ pig ?. PigFkFarm ==. just (farm ^. FarmId)
    where_ $
          pig ?. PigNumberOfLegs ==. val 4
      &&. farm ^. FarmCity ==. val city
    return (farm, pig)
  • 我得到了所有的农场和他们的四条腿猪。
  • 我得到了农场,即使他们根本没有任何猪(感谢左外接)。
  • 然而,我没有拥有2,3,5条腿的农场,但这是我所需要的:如果猪有3条腿,我想要农场没有任何猪。

我的第二种方法是一个基于sql的子查询,该查询在类型检查期间已经失败,这可能是因为本文顶部链接的限制:

代码语言:javascript
复制
pigsQuery = from $ \pig -> do
  where_ $ pig ^. PigNumberOfLegs ==. val 4
  return pig

fetchFarmsByCity2 city = runDb . select . from $
  \(farm `LeftOuterJoin` pig) -> do
    pigs <- pigsQuery
    on $ pig ?. PigFkFarm ==. just (farm ^. FarmId)
    where_ $
          farm ^. FarmCity ==. val city

还有别的办法解决这个问题吗?我能以某种方式移动外部连接前面的腿数限制(在第一种方法中)吗?将其分成两个查询将是我最后的措施。

我觉得这是标准的,足以有其他的解决办法。

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 08:51:53

它似乎通过将"4腿“限制移到on子句而不是where_子句来工作:

代码语言:javascript
复制
fetchFarmsByCity1 city = select . from $
  \(farm `LeftOuterJoin` pig) -> do
    on $
        (pig ?. PigFkFarm ==. just (farm ^. FarmId)
        &&. (pig ?. PigNumberOfLegs ==. just (val 4)))
    where_ $
      farm ^. FarmCity ==. val city
    return (farm, pig)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32380467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档