Scala Slick 无法将查询与计数联合起来

Posted

技术标签:

【中文标题】Scala Slick 无法将查询与计数联合起来【英文标题】:Scala Slick can't union queries with count 【发布时间】:2017-01-18 19:30:20 【问题描述】:

我有两个 Slick 查询,它们通过过滤器返回 count,它们看起来像这样:

val firstCount = query.filter(_.someCond).length
val secondCount = query.filter(_.someCond).length
val unionCount = firstCount union secondCount //Place with the problem

Slick 可以为没有计数的单个查询进行联合 - 返回 Rep[Int] 而不是 QueruBase

我的目标是在一次 sql 查询中使用 firstCountsecondCount

【问题讨论】:

我猜你可以这样做:val a1 = q1.length.result; val a2 = q2.length.result; val action = DBIO.sequence(Seq(a1, a2)) 并提取第一个和第二个结果... 以上实际上不会在单个查询中执行此操作(如问题中所述)。 val unionCount = (query.filter(_.someCond) union query.filter(_.someCond)).length 怎么样? @Pawel Dolega 我想在 sql 中做这样的事情:select count(1) from some_table union select count(1) from some_table @Roman 我的目标是采用两个 lengths - 从第一个和第二个查询作为两个 int 参数,我不需要两个联合的长度 【参考方案1】:

哦,孩子,我看得出你不会喜欢这个,但这是我不用太长时间调查就能弄清楚的唯一方法。

这比解决方案更像是一种解决方法。 @insan-e 解决方案(只需使用两个查询)实际上可能更可行(恕我直言,但我不知道您的限制) .

这里是查询:

    TABLE1
      .filter(_.someColumn === "1stFilterValue") // your filter basically
      .map(_ => LiteralColumn(1))
      .union 
        TABLE2
          .filter(_.someColumn === "2ndFilterValue") // again your filter
          .map(_ => LiteralColumn(2))
      .groupBy  marker =>
        marker
      .map  case (marker, grouped) =>
        (marker, grouped.length)
      

这将产生以下查询(假设我有列 name - 用于过滤):

select x2, count(1) 
from (
    select 1 as x2 
    from "TABLE1" 
    where "NAME" = 'Mike' 
    union 
    select 2 as x2 
    from "TABLE2" 
    where "NAME" = 'Tom'
 ) 
 group by x2

这将返回以下结果:

DEBUG s.j.J.benchmark - Execution of prepared statement took 50ms
DEBUG s.j.S.result - /----+----------\
DEBUG s.j.S.result - | 1  | 2        |
DEBUG s.j.S.result - | X2 | COUNT(1) |
DEBUG s.j.S.result - |----+----------|
DEBUG s.j.S.result - | 1  | 1        |
DEBUG s.j.S.result - | 2  | 1        |
DEBUG s.j.S.result - \----+----------/

请记住,如果 count 等于 0(无行),特定行将不会出现在结果中。你需要在你的代码中处理这个!

【讨论】:

我已经尝试过这样的解决方案 - select x2, count(1) from ( select 1 as x2 from "TABLE1" where "NAME" = 'Mike' union select 2 as x2 from "TABLE2" where "NAME" = 'Tom' ) group by x2 这是错误的,例如,如果我在 x2 中有数千行,结果我将有数千个计数而不是单个。 我不确定你在上面说什么。你会有两个结果对吗?一个查询(联合的第一部分)计算一个计数,第二个查询(联合的第二部分)计算另一个。这不是你想要的吗?基本上,结果是由您选择的任何标记标识的两个计数(标记上方是 12)。

以上是关于Scala Slick 无法将查询与计数联合起来的主要内容,如果未能解决你的问题,请参考以下文章

Scala Slick 将 Rep 子查询组合成一个 re

Scala slick 2.0 updateAll 等同于 insertALL?

scala slick 方法我目前无法理解

使用 Java+Scala+Slick2D 时“无法从给定的启动配置中找到主要方法”

Slick - 使用多个表更新查询

Scala Slick 如何将 Scala 代码翻译成 JDBC?