首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Esqueleto中子查询结果的Join

Esqueleto中子查询结果的Join
EN

Stack Overflow用户
提问于 2018-10-03 18:48:13
回答 1查看 84关注 0票数 0

我试图翻译的查询的基本部分如下所示:

代码语言:javascript
复制
SELECT c.id, c.name, officer.id, officer.name
FROM (
  SELECT DISTINCT ON (company.number) company.id, company.name
  FROM company
  ORDER BY company.number DESC
  LIMIT 15
) AS c
INNER JOIN officer ON c.id = officer.company_id;

我正在尝试的Esqueleto (它没有编译)是这样的:

代码语言:javascript
复制
query mLocation = E.select $ E.from $
  \o -> do
    let sub = E.subList_select
              $ E.from
              $ \(c `E.LeftOuterJoin` cc `E.LeftOuterJoin` l) -> do
                E.distinctOn [ E.don (c E.^. CompanyNumber) ] $ do
                  E.on $ c E.^. CompanyPostcode E.==. l E.^. LocationPostcode
                  E.on $ c E.^. CompanyId E.==. cc E.^. CompanyCategoryCompany
                  whereRegisteredFrom c (queryFilterFromDate qf)
                  whereRegisteredTo c (queryFilterToDate qf)
                  whereLikeTerm c (queryFilterSearchTerm qf)
                  whereVisible c
                  whereWithinRadiusOf (queryFilterRadius qf) mLocation

                  let categories' = map (\(QueryCategory a) -> a) (fromMaybe [] $ queryFilterCategories qf)
                      subQuery = E.subList_select $ E.from $ \cat -> do
                                 E.where_ $ cat E.^. CategoryCode `E.in_` E.valList categories'
                                 return $ cat E.^. CategoryId

                  when (isJust (queryFilterCategories qf))
                    (E.where_ $ cc E.^. CompanyCategoryCategory `E.in_` subQuery)

                  E.limit (fromInteger limit)
                  E.offset $ (fromInteger page - 1) * (fromInteger limit)
                  E.orderBy [ E.desc (c E.^. CompanyNumber) ]
                  return c
    E.on $ sub E.^. CompanyId E.==. o E.^. OfficerCompanyId
    return (sub, o)
EN

回答 1

Stack Overflow用户

发布于 2018-10-03 19:39:41

最后用这个解决了这个问题:

代码语言:javascript
复制
query :: Maybe Location -> DB [(Entity Company, Entity Officer)]
query mLocation = E.select $ E.from $ \(c' `E.InnerJoin` o) -> do
  let sub = E.subList_select $ E.from
            $ \(c `E.LeftOuterJoin` cc `E.LeftOuterJoin` l) -> do
              E.distinctOn [ E.don (c E.^. CompanyNumber) ] $ do
                E.on $ c E.^. CompanyPostcode E.==. l E.^. LocationPostcode
                E.on $ c E.^. CompanyId E.==. cc E.^. CompanyCategoryCompany
                whereRegisteredFrom c (queryFilterFromDate qf)
                whereRegisteredTo c (queryFilterToDate qf)
                whereLikeTerm c (queryFilterSearchTerm qf)
                whereVisible c
                whereWithinRadiusOf (queryFilterRadius qf) mLocation

                let categories' = map (\(QueryCategory a) -> a) (fromMaybe [] $ queryFilterCategories qf)
                    subQuery = E.subList_select $ E.from $ \cat -> do
                               E.where_ $ cat E.^. CategoryCode `E.in_` E.valList categories'
                               return $ cat E.^. CategoryId

                when (isJust (queryFilterCategories qf))
                  (E.where_ $ cc E.^. CompanyCategoryCategory `E.in_` subQuery)

                E.limit (fromInteger limit)
                E.offset $ (fromInteger page - 1) * (fromInteger limit)
                E.orderBy [ E.desc (c E.^. CompanyNumber) ]
                return $ c E.^. CompanyId
  E.on $ c' E.^. CompanyId E.==. o E.^. OfficerCompanyId
  E.where_ $ c' E.^. CompanyId `E.in_` sub
  return (c', o)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52625391

复制
相关文章

相似问题

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