Postgresql
列必須出現在 GROUP BY 子句中或在聚合函式中使用
我有一個包含 col1、col2、col3 列的簡單表。都不能為空。
我想刪除元組 (col1, col2) 有多個條目的所有行。背景:應添加 (col1, col2) 的唯一約束。
drop table mytable; create table mytable ( col1 integer not null, col2 integer not null, col3 integer not null); -- rows to delete insert into mytable values (1, 1, 1); insert into mytable values (1, 1, 2); -- rows to keep insert into mytable values (2, 2, 1); insert into mytable values (2, 3, 2); delete from mytable where (col1, col2) in ( select col1, col2 from mytable group by (col1, col2) having count(distinct col3) >1) ; select * from mytable;
以上適用於 PostgreSQL 10,但在舊版本上失敗。
舊版本告訴我這個錯誤資訊:
錯誤:列“mytable.col1”必須出現在 GROUP BY 子句中或在聚合函式中使用
如何讓它在 PG 9.3 上執行?
您只需要刪除
group by (col1, col2)
. 這也適用於 9.4 版及之前的版本:delete from mytable where (col1, col2) in ( select col1, col2 from mytable group by col1, col2 -- <-- changed having count(distinct col3) >1) ;
它失敗的原因(我認為)是雖然
(col1, col2)
相當於row(col1, col2)
,但在 9.5 中修復的各種條款中處理它的方式存在一些不一致。WHERE
在以前的版本中,您可以在:中使用更複雜的構造WHERE (SELECT (col1, col2)) IN ...
。所以這也應該在 9.3 中工作:delete from mytable where (select (col1, col2)) in ( select (col1, col2) from mytable group by (col1, col2) having count(distinct col3) >1) ;