Postgresql
為什麼按主鍵分組時可以選擇所有欄位,但按另一列分組時不能
這是一條有效的語句(其中 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 子句中或在聚合函式中使用