О, мальчик, я вижу, вам это не понравится, но это единственный способ, который я мог бы выяснить без предварительного расследования.
Это решение может быть более сложным, чем решение проблемы. @ решение 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 (без строк). Вам нужно будет обработать это в своем коде!
Я думаю, вы могли бы сделать: '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'? – Roman