2017-01-18 2 views
1

У меня есть два Slick запросов, которые возвращают count фильтра, то они выглядят так:Scala Slick не объединение запросов с подсчетом

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.

Моя цель - принять firstCount и secondCount во время одного запроса sql.

+0

Я думаю, вы могли бы сделать: 'val a1 = q1.length.result; val a2 = q2.length.result; val action = DBIO.sequence (Seq (a1, a2)) 'и извлечь первый и второй результат ... –

+0

Выше на самом деле не делал бы этого в одном запросе (как указано в вопросе). –

+0

Как насчет 'val unionCount = (query.filter (_. SomeCond) union query.filter (_. SomeCond)). Length'? – Roman

ответ

0

О, мальчик, я вижу, вам это не понравится, но это единственный способ, который я мог бы выяснить без предварительного расследования.

Это решение может быть более сложным, чем решение проблемы. @ решение insan-e (просто используйте два запроса) может быть фактически более выполнимым (IMHO это - но я не знаю ваших ограничений).

Вот запрос:

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 - \----+----------/ 

Имейте в виду, что определенная строка не будет отображаться в результатах, если c ount for равно 0 (без строк). Вам нужно будет обработать это в своем коде!

+0

Я уже пробовал решение вроде этого - 'select x2, count (1) от ( выберите 1 как x2 из" TABLE1 " где" NAME " союз = 'Mike' выберите 2 как x2 от "TABLE2" где "NAME" = "Томи ) группы по x2 ' Это неправильно, например, если у меня есть тысячи строк в 'x2', в результат у меня будет тысячи вместо одиночного. – pacman

+0

Я не уверен, что вы говорите выше. У вас будет два результата? Один счетчик для одного запроса (первая часть объединения), второй для второго запроса (вторая часть объединения). Разве это не то, что вы хотели? В основном результаты - это два подсчета, идентифицированные любым выбранным маркером (над маркером «1» и «2»). –

Смежные вопросы