【问题标题】:Slick 3 join queriesSlick 3 连接查询
【发布时间】:2015-11-04 11:38:12
【问题描述】:

我应该从 3 个表中选择数据 我将在 inSet 操作中使用的每个查询的结果

 val q1 = tQ.filter(...).groupBy(_.s).map(_._1)
 val r1 = Await.result(db.run(q1.result), Duration.Inf)

 val q2 = tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1)
 val r2 = Await.result(db.run(q2.result), Duration.Inf)

 val q3 = tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1)
 val r3 = Await.result(db.run(q3.result), Duration.Inf)

我可以将 2 个小查询加入 ONE 吗?

谢谢!

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    Slick 查询是高度可组合的。应该这样做:

    val q = for {
      r1 <- tQ.filter(...).groupBy(_.s).map(_._1).result
      r2 <- tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1).result
      r3 <- tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1).result
    } yield r3
    
    Await.result(db.run(q), Duration.Inf)
    

    如果X 是您想要传递给inSet 的某种类型,那么您的.filter(...).groupBy(...).map(_._1) 类型就是Query[Xs, X, Seq]。调用.result 会得到DBIO[Seq[Xs]]。由于您在for 理解块中并且所有理解都具有DBIO 类型,因此您的rN 结果实际上是Seq[X],因此您可以将它们传递给inSet 方法。

    查看monadic joins 上的文档。

    您可能还想考虑使用inSetBind。

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多