在PostgreSQL文檔,它說:示例GROUP BY限制
當GROUP BY存在時,它是無效的SELECT列表表達式來指未分組列除了聚集函數內,或者如果未分組列在功能上依賴於分組的列,因爲本來是一個以上的可能值來返回未分組的列
我不理解「there would otherwise be more than one possible value to return for an ungrouped column
」的部分。
有人能給我舉個例子嗎?怎麼能有一個可能的值返回一個取消組合列?
在PostgreSQL文檔,它說:示例GROUP BY限制
當GROUP BY存在時,它是無效的SELECT列表表達式來指未分組列除了聚集函數內,或者如果未分組列在功能上依賴於分組的列,因爲本來是一個以上的可能值來返回未分組的列
我不理解「there would otherwise be more than one possible value to return for an ungrouped column
」的部分。
有人能給我舉個例子嗎?怎麼能有一個可能的值返回一個取消組合列?
考慮一下這個表:
col_1 | col_2 | col_3
A 10 10
A 11 20
B 20 40
C 40 60
並嘗試運行該查詢,總結了
SELECT col_1, col_2, SUM(col_3)
FROM t1
GROUP BY col_1
上面的查詢可以col_3值2個可能的輸出:
Output 1: Here, col_2 = 10
---------------------------
col_1 | col_2 | SUM(col_3)
A 10 30
B 20 40
C 40 60
Output 2: Here, col_2 = 11
---------------------------
col_1 | col_2 | SUM(col_3)
A 11 30
B 20 40
C 40 60
這是因爲col_2不包含在GROUP BY子句中。求和col_3發生,因爲預期基於由COL_1分組但現在的SQL引擎不知道你是否想與具有COL_2行的11或11,因此,「有,否則將不止一個可以返回的值對於未分組列」
上面的查詢將正常工作與MySQL,它會隨機返回上述2個輸出而Oracle/SQL服務器的人會扔你提到的錯誤
比方說,你有一張桌子......名字,城市,電話號碼。你想按城市計算人數。所以你按城市選擇城市和數量。在查詢中包含電話號碼(未分組)是沒有意義的,因爲每個分組最多可能會有多個電話號碼,並且分貝不知道您想要什麼。
存在,否則將對於未分組的列可返回多個可能的值
讓我嘗試用數據的小樣本來解釋這一點:
CREATE TABLE yourtable ([year] int, [amt] int);
INSERT INTO yourtable ([year], [amt])
VALUES
(2012, 50),
(2012, 60),
(2011, 100),
(2011, 89),
(2013, 25);
該樣品有3個獨立多年,現在我們希望得到每年的量的總和。
如果您使用查詢:
select year, sum(amt) TotalPerYear
from yourtable
而且你沒有提供的Year
列GROUP BY
,那麼如何將數據庫引擎知道什麼樣的價值,爲今年選擇,因爲在一個以上的值柱。
GROUP BY
是說我想每年的總和,這並不是說我想要的總和,無論它決定的一年。
select year, sum(amt) TotalPerYear
from yourtable
group by year
的GROUP BY
在選擇每列,確保您得到的分組列正確的聚集。
MySQL是一個允許此行爲的數據庫,它包含選擇列表中不屬於group by或aggregate函數的列的explicitly states in the docs可能導致意外的結果。
從MySQL的文檔:
您可以使用此功能,避免不必要的列排序和分組,以獲得更好的性能。 但是,這對於每個組中未在GROUP BY中指定的每個非聚集列中的所有值都相同時都很有用。服務器是可以自由選擇每組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,從每個組中選擇值不受添加ORDER BY子句的影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。
查詢在哪裏? – 2013-04-06 00:29:04
我要求提供文檔示例/說明,而不是針對特定問題的解決方案 – Chin 2013-04-06 00:31:15
我重新考慮了我的問題。正如我所說,這只是關於文檔。我只是想了解它。 – Chin 2013-04-06 00:41:10