2017-06-27 6 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標準でサポートされています。その理由は、idcompaniesの各行を定義するだけでなく、uniqueまたはprimary keyという制約を使用して定義されているため、unique制約のPostgresで動作するかどうかはわかりません。

したがって、データベースは、同じ行の他の列を安全に参照できることを認識しています。これは「機能的依存性」と呼ばれます。

この機能もMySQLに追加されました(文書番号here)。あなたは、Postgresのdescriptionよりも従っているドキュメントを簡単に見つけるかもしれない:

GROUP BYが存在する、または任意の集約関数が存在する場合、SELECTリスト式は、集約内を除いてグループ化されていない 列を参照すること が有効ではありませんグループ化されていない列 がグループ化された列に機能的に依存している場合、 はグループ化されていない 列に対して複数の値を返す可能性があるためです。グループ化された列(または のサブセット)がグループ化されていない列 を含むテーブルの主キーである場合、機能的な依存関係が存在します。

関連する問題