[英]How to Prove that using subselect queries in SQL is killing performance of server
[英]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)
我的第二種方法是基於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.