簡體   English   中英

在Esqueleto中聯接子查詢的結果

[英]Join on result of subquery in Esqueleto

我要翻譯的查詢的基本部分是這樣的:

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(無法編譯)是這樣的:

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)

最終解決了這個問題:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM