CTE 的聚合列不能在 PostgreSQL 查询的 WHERE 子句中使用

And*_*nin 5 sql postgresql aggregate-functions common-table-expression

我的查询遵循以下结构:

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;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:[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 位

EzL*_*zLo 4

t2.count解释为聚合 COUNT() 函数,并且您的 t2 表没有名为 的列count

确保您的表确实有一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;
Run Code Online (Sandbox Code Playgroud)