gpt4 book ai didi

sql - 在 Slick 2.0 中没有 groupBy 的情况下聚合多列

转载 作者:行者123 更新时间:2023-12-04 21:18:28 27 4
gpt4 key购买 nike

我想用 Slick 执行聚合,执行 SQL,如下所示:

SELECT MIN(a), MAX(a) FROM table_a;

其中 table_a 有一个 INTa
在 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中,生成了两个独立的子选择,这就像编写两个独立的查询。 2、生成如下:
    select min(x2."a"), max(x2."a") from "table_a" x2 group by 1

    但是,此语法对于 Postgres 不正确(它按第一列值分组,在这种情况下无效)。事实上,AFAIK 不可能在 Postgres 中按常量值分组,除非省略 group by 子句。

    有没有办法让 Slick 在没有 GROUP BY 的情况下发出带有两个聚合的单个查询?

    最佳答案

    语法错误是一个错误。我创建了一张票:https://github.com/slick/slick/issues/630
    在这种情况下,子查询是 Slick 的 SQL 编译器当前生成非最佳代码的限制。我们正在努力改善这种情况。

    作为一种变通方法,这里有一个模式可以在引擎盖下交换生成的 SQL 并保持其他所有内容完好无损:https://gist.github.com/cvogt/8054159

    关于sql - 在 Slick 2.0 中没有 groupBy 的情况下聚合多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414449/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com