簡體   English   中英

如何用Esqueleto編寫查詢/子選擇?

[英]How to compose queries/subselect with Esqueleto?

根據此答案 ,我得出結論,Esqueleto不允許使用left outer join聯接組成兩個查詢。 但是,我希望在某個地方仍然可以解決我的問題。

我想用另外受限制的表做左外部聯接。 考慮我的第一種方法:

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的子查詢,它在類型檢查期間已經失敗,這可能是由於這篇文章頂部鏈接的限制所致:

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

還有另一種解決方法嗎? 我可以以某種方式在外部聯接之前移動支腿數量限制(在第一種方法中)嗎? 將其拆分為兩個查詢將是我的最后選擇。

我覺得這已經足夠標准,可以有其他解決方案了。

它似乎通過將“ 4條腿”限制移到on子句而不是where_子句來工作:

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)

暫無
暫無

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

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