我的查詢遵循以下結構:
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 位
uj5u.com熱心網友回復:
被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;
uj5u.com熱心網友回復:
看起來是導致問題的“t2.count”。
在dbfiddle上,只有當 table2 中沒有名為“count”的列時,我才能重現該問題。
換句話說,只有當表2這樣定義時才會發生錯誤:
create table table2 (x int, y int);
但是,如果我添加了“計數”列,錯誤就消失了
create table table2 (x int, y int, count int);
我相信當沒有這樣的列時,postgres 將“count”作為聚合函式處理并拋出錯誤。
所以,我的解決方案是檢查這樣的列是否存在,并且永遠不要使用保留的關鍵字作為列名
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410421.html
標籤:
