2017-06-27 45 views
0

我有這樣的查詢。版本8.4和9.5中的聚合函數是不同的?

SELECT companies.id, companies.code, MAX(disclosures.filed_at) disclosure_filed_at 
FROM \"companies\" INNER JOIN \"disclosures\" ON \"disclosures\".\"company_id\" = \"companies\".\"id\" 
GROUP BY companies.id 

此查詢工作在PostgreSQL 9.5.2,但它在8.4.20版本錯誤而失敗。

PG::GroupingError: ERROR: column "companies.code" must appear in the GROUP BY clause or be used in an aggregate function 

如果我添加companies.codeGROUP BY條款,那麼它的工作原理。但是,當我通過companies.*選擇時,我無法按companies.*分組。

我應該寫在8.4版本中的所有列使用*

回答

1

Postgres的行爲是由ANSI標準支持。原因是id不僅定義了companies中的每一行,但它被定義爲這樣做(使用uniqueprimary key約束,儘管我不確定這是否適用於Postgres中的unique約束)。

因此,數據庫知道它可以安全地引用來自同一行任何其他列。這被稱爲「功能依賴」。

此功能現在也被添加到MySQL(記錄here)。你可能會發現,文檔更容易跟隨比Postgres的description

GROUP BY存在,或任何聚合函數都存在,它 是無效的SELECT列表中的表達式是指未分組 列除了聚集中功能時,或者當未分組列 在功能上依賴於分組的列,因爲將 否則是多於一個的可能值,以返回未分組 柱。如果分組的列(或其 子集)是含有 未分組列的表的主鍵的功能依賴存在。