![](/img/trans.png)
[英]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.