【发布时间】:2014-01-28 18:59:36
【问题描述】:
我想使用 Slick 执行聚合,执行如下 SQL:
SELECT MIN(a), MAX(a) FROM table_a;
其中table_a 有一个INT 列a
在 Slick 中给出表定义:
class A(tag: Tag) extends Table[Int](tag, "table_a") {
def a = column[Int]("a")
def * = a
}
val A = TableQuery[A]
val as = A.map(_.a)
看来我有两个选择:
这样写:
Query(as.min, as.max)-
这样写:
as .groupBy(_ => 1) .map { case (_, as) => (as.map(identity).min, as.map(identity).max) }
但是,无论哪种情况,生成的 sql 都不好。 1、生成了两个独立的sub-selects,相当于写了两个独立的查询。 2、生成如下:
select min(x2."a"), max(x2."a") from "table_a" x2 group by 1
但是,这种语法对于 Postgres 是不正确的(它按第一列值分组,在这种情况下是无效的)。事实上,AFAIK 不可能在 Postgres 中按常量值分组,除非省略 group by 子句。
有没有办法让 Slick 在没有 GROUP BY 的情况下发出包含两个聚合的单个查询?
【问题讨论】: