Scala Плавное объединение повторных подзапросов в один повтор. - PullRequest
1 голос
/ 25 января 2020

Я суммирую итоги в двух разных таблицах базы данных:

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

Любые идеи о том, как сделать это в Slick, кроме использования простого SQL запроса?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Каждый вызов .result создает действие DBIO, которое является оператором SQL. Хитрость в сокращении количества действий состоит в том, чтобы найти способ объединить два запроса (или два Rep с) в одно действие.

В вашем случае вы можете сжать два запроса:

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
0 голосов
/ 01 февраля 2020

Просто скажи это так:

(sum1 + sum2).result
...