基于this answer,我得出结论,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还有别的办法解决这个问题吗?我能以某种方式移动外部连接前面的腿数限制(在第一种方法中)吗?将其分成两个查询将是我最后的措施。
我觉得这是标准的,足以有其他的解决办法。
发布于 2015-11-04 08:51:53
它似乎通过将"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)https://stackoverflow.com/questions/32380467
复制相似问题