来自 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;
我的查询遵循以下结构:
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
被解释为 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;