Postgresql

為什麼按主鍵分組時可以選擇所有欄位,但按另一列分組時不能

  • December 13, 2016

這是一條有效的語句(其中 id 是表的主鍵):

select * from table group by id ;

這不是:

select * from table group by name ;

錯誤:列“pgluser.id”必須出現在 GROUP BY 子句中或在聚合函式中使用

小提琴

問題是為什麼第一個是合法查詢,即為什麼按主鍵分組是有效的?

id是主鍵。

據我記得,這實際上是根據 ANSI/ISO SQL 的合法查詢。

按主鍵分組會在每個組中產生一條記錄,這在邏輯上與根本不分組/按所有列分組相同,因此我們可以選擇所有其他列。

create table t (id int primary key,c1 int,c2 int)
insert into t (id,c1,c2) values (1,2,3),(4,5,6);
select * from t group by id;

+----+----+----+
| id | c1 | c2 |
+----+----+----+
| 1  | 2  | 3  |
+----+----+----+
| 4  | 5  | 6  |
+----+----+----+

@a_horse_with_no_name 給出的參考

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-GROUPBY

當存在 GROUP BY 或存在任何聚合函式時,SELECT 列表表達式引用未分組列是無效的,除非在聚合函式內或當未分組列在功能上依賴於分組列時,否則會有更多為未分組的列返回一個可能的值。如果分組列(或其子集)是包含未分組列的表的主鍵,則存在功能依賴性。


雖然從邏輯上講,我們希望 UNIQUE NOT NULL 遵循相同的行為,但它僅適用於 PK(如文件中所述)

create table t (id int unique not null,c1 int,c2 int);
insert into t (id,c1,c2) values (1,2,3),(4,5,6);
select * from t group by id;

$$ Code: 0, SQL State: 42803 $$ 錯誤:列“t.c1”必須出現在 GROUP BY 子句中或在聚合函式中使用

引用自:https://dba.stackexchange.com/questions/158015