在SLICK 2.0中聚合多列而不分组By [英] Aggregate multiple columns without groupBy in Slick 2.0

查看:0
本文介绍了在SLICK 2.0中聚合多列而不分组By的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用执行SQL的SLICK执行聚合,如下所示:

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

其中table_aINTa

在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)

我似乎有两个选择:

  1. 写下这样的内容:Query(as.min, as.max)

  2. 写些类似的东西:

    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是不正确的(它按第一个列值分组,在本例中是无效的)。事实上,除非省略GROUP BY子句,否则无法在postgres中按常量值进行分组。

有没有办法使SLICK在没有GROUP BY的情况下使用两个聚合发出单个查询?

推荐答案

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

作为一种解决办法,下面是一个模式,它可以在幕后调出生成的SQL并保持其他所有内容不变:https://gist.github.com/cvogt/8054159

这篇关于在SLICK 2.0中聚合多列而不分组By的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆