この回答に基づいて、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)
- 私はすべての農場とその 4 本足の豚を手に入れました。
- 豚がまったくいない場合でも、農場を取得します(左外部結合のおかげです)。
- ただし、足が 2 本、3 本、または 5 本の豚がいる農場は得られませんが、必要なものは次のとおりです。豚の足が 3 本の場合、豚のいない農場が必要です。
私の2番目のアプローチは、おそらくこの投稿の上部にリンクされている制限のために、型チェック中にすでに失敗する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
これを解決する別の方法はありますか?外部結合の前に足の数制限をどうにかして移動できますか (最初のアプローチで)? それを 2 つのクエリに分割することは、私の最後の手段です。
これは、代替ソリューションを用意するのに十分な標準だと思います。