基于这个答案,我得出结论,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-motivated 子查询,它在类型检查期间已经失败,可能是因为这篇文章顶部链接的限制:
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
还有其他方法可以解决这个问题吗?我可以以某种方式移动外部连接前面的腿数限制(在第一种方法中)吗?将它分成两个查询将是我最后的手段。
我觉得这足够标准,可以有替代解决方案。