Scala Slick 将 Rep 子查询组合成一个 re
Scala Slick combining Rep sub queries into one re
我在两个不同的数据库表中汇总总数:
val sum1Query: Rep[Int] = tableQuery1.map(_.amount).sum.ifNull(0)
val sum2Query: Rep[Int] = tableQuery2.map(_.amount).sum.ifNull(0)
for {
sum1 <- sum1Query.result
sum2 <- sum2Query.result
} yield {
sum1 + sum2
}
每次调用 .result
时都会对数据库运行 2 SQL 次查询。我正在寻找一种方法让它只使用一个 SQL 查询。
这样的东西不起作用:
for {
sum1 <- sum1Query
sum2 <- sum2Query
} yield {
sum1 + sum2
}.result
除了使用普通 SQL 查询之外,关于如何在 Slick 中执行此操作的任何想法?
每次调用 .result
都会创建一个 DBIO
动作,这是一个 SQL 语句。减少操作数量的诀窍是找到一种方法将两个查询(或两个 Rep
s)组合成一个操作。
在您的情况下,您可以压缩两个查询:
val sum1 = table1.map(_.amount).sum.ifNull(0)
val sum2 = table2.map(_.amount).sum.ifNull(0)
val query = sum1.zip(sum2)
当 运行 和 query.result
时,您将执行单个查询,例如:
select ifnull(x2.x3,0), ifnull(x4.x5,0)
from
(select sum("amount") as x3 from "table_1") x2,
(select sum("amount") as x5 from "table_2") x4
...这将产生两个值的元组。
但是,由于您已经有了 Rep[Int]
,您可以在数据库中使用 +
:
val query = sum1 + sum2
...这将是一个查询:
select ifnull(x2.x3,0) + ifnull(x4.x5,0)
from
(select sum("amount") as x3 from "table_1") x2,
(select sum("amount") as x5 from "table_2") x4
就这样说吧:
(sum1 + sum2).result
我在两个不同的数据库表中汇总总数:
val sum1Query: Rep[Int] = tableQuery1.map(_.amount).sum.ifNull(0)
val sum2Query: Rep[Int] = tableQuery2.map(_.amount).sum.ifNull(0)
for {
sum1 <- sum1Query.result
sum2 <- sum2Query.result
} yield {
sum1 + sum2
}
每次调用 .result
时都会对数据库运行 2 SQL 次查询。我正在寻找一种方法让它只使用一个 SQL 查询。
这样的东西不起作用:
for {
sum1 <- sum1Query
sum2 <- sum2Query
} yield {
sum1 + sum2
}.result
除了使用普通 SQL 查询之外,关于如何在 Slick 中执行此操作的任何想法?
每次调用 .result
都会创建一个 DBIO
动作,这是一个 SQL 语句。减少操作数量的诀窍是找到一种方法将两个查询(或两个 Rep
s)组合成一个操作。
在您的情况下,您可以压缩两个查询:
val sum1 = table1.map(_.amount).sum.ifNull(0)
val sum2 = table2.map(_.amount).sum.ifNull(0)
val query = sum1.zip(sum2)
当 运行 和 query.result
时,您将执行单个查询,例如:
select ifnull(x2.x3,0), ifnull(x4.x5,0)
from
(select sum("amount") as x3 from "table_1") x2,
(select sum("amount") as x5 from "table_2") x4
...这将产生两个值的元组。
但是,由于您已经有了 Rep[Int]
,您可以在数据库中使用 +
:
val query = sum1 + sum2
...这将是一个查询:
select ifnull(x2.x3,0) + ifnull(x4.x5,0)
from
(select sum("amount") as x3 from "table_1") x2,
(select sum("amount") as x5 from "table_2") x4
就这样说吧:
(sum1 + sum2).result