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 查询中使用 firstCount
和 secondCount
。
【问题讨论】:
我猜你可以这样做: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
中有数千行,结果我将有数千个计数而不是单个。
我不确定你在上面说什么。你会有两个结果对吗?一个查询(联合的第一部分)计算一个计数,第二个查询(联合的第二部分)计算另一个。这不是你想要的吗?基本上,结果是由您选择的任何标记标识的两个计数(标记上方是 1
和 2
)。以上是关于Scala Slick 无法将查询与计数联合起来的主要内容,如果未能解决你的问题,请参考以下文章
Scala slick 2.0 updateAll 等同于 insertALL?