postgresql GROUP BY子表的所有列,而不枚举它们

wz3gfoph  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(120)

有没有一种方法可以在子表中按所有列进行分组,而无需枚举所有列?例如,假设我想查询如下内容:

SELECT t1.col_1, t1.col_2, ... , t1.col_n, t2.col_k, COUNT(*)
    FROM t1, t2
    WHERE t2.col1>0
      AND t2.col1=t1.col1
    GROUP BY t1.col_1, t1.col_2, ... , t1.col_n, t2.col_k

如果n很大,写出所有这些列名(而且 * 两次 *)是冗长的。我想知道是否有一个标准的语言结构来做到这一点。例如,关键字COLUMNS的用法如下:

SELECT COLUMNS(t1), t2.col_k, COUNT(*)
   FROM ...
   ...
   GROUP BY COLUMNS(t1), t2.col_k

(Tag包含在Postgres中,因为如果没有SQL标准存在,我对Postgres解决方案感兴趣。

6xfqseft

6xfqseft1#

您可以在SELECT列表中使用t1.*。它扩展到t1的所有列。完全符合你的要求。
GROUP BY列表中不允许使用相同的语法t1.*。但是您可以将t1primary key列放在那里,以覆盖同一个表的所有列。几乎是你所要求的。

SELECT t1.*, t2.col_k, COUNT(*) AS my_count
FROM   t1 
JOIN   t2 ON t2.col1 = t1.col1
WHERE  t2.col1 > 0
GROUP  BY t1.pk_column, t2.col_k;

这从Postgres 9.1开始工作,并符合标准SQL。参见:

  • PostgreSQL - GROUP BY子句

SQL标准允许以类似的方式覆盖更多的函数依赖关系(如UNIQUE列),但这在Postgres中没有实现。

相关问题