1

この回答に基づいて、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 つのクエリに分割することは、私の最後の手段です。

これは、代替ソリューションを用意するのに十分な標準だと思います。

4

1 に答える 1

2

「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)
于 2015-11-04T08:51:53.553 に答える