来自 CTE 的聚合列不能用于 PostgreSQL 查询中的 WHERE 子句

Aggregate column from CTE cannot be used in WHERE clause in the query in PostgreSQL

我的查询遵循以下结构:

WITH CTE AS (
    SELECT t1.x, COUNT(t1.y) AS count
    FROM table1 t1
    GROUP BY t1.x
)
SELECT CTE.x, CTE.count AS newCount, t2.count AS oldCount
FROM table2 t2 JOIN CTE ON t2.x = CTE.x
WHERE t2.count != CTE.count;

我收到以下错误:[42803] ERROR: aggregate functions are not allowed in WHERE

看起来 CTE.count 是触发此错误的集合。不是应该在主查询之前计算 CTE 吗?如何重写查询以避免这种情况?

x86_64-pc-linux-gnu 上的 PostgreSQL 13.2,由 gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5) 编译,64 位

看起来是“t2.count”导致了问题。

dbfiddle 上,只有当 table2 中没有名为“count”的列时,我才能重现该问题。

也就是说,只有当table 2这样定义时才会出现错误:

create table table2 (x int, y int);

但是,如果我添加了“count”列,错误就消失了

create table table2 (x int, y int, count int);

我相信当没有这样的列时,postgres 将“计数”作为聚合函数处理并抛出错误。

因此,我的解决方案是检查是否存在此类列,并且永远不要使用保留的关键字作为列名

t2.count 被解释为 ,而您的 t2 table 没有名为 count 的列。

确保您的 table 确实有一个 count 列,或者确保在加入之前计算它在另一个 CTE 上的总计数,然后比较结果。还要避免使用别名“count”,如下所示:

WITH CTE AS (
    SELECT t1.x, COUNT(t1.y) AS total
    FROM table1 t1
    GROUP BY t1.x
),
CTE2 AS (
    SELECT t2.x, COUNT(t2.y) AS total
    FROM table2 t2
    GROUP BY t2.x
)
SELECT 
    CTE1.x, 
    CTE1.total AS newCount, 
    CTE2.total AS oldCount
FROM 
    CTE2 
    JOIN CTE1 ON CTE2.x = CTE1.x
WHERE 
    CTE2.total != CTE1.total;