記事はtag
のあるのテーブルを照会し、その記事の行に属するすべての(関連性のない)タグに照会します。GROUP BYのすべての列を指定する必要なしにサブクエリからSELECT
例のテーブルやクエリ:
CREATE TABLE article (id SERIAL, body TEXT);
CREATE TABLE article_tag (article INT, tag INT);
CREATE TABLE tag (id SERIAL, title TEXT);
SELECT DISTICT ON (id)
q.id, q.body, STRING_AGG(q.tag_title, '|') tags
FROM (
SELECT a.*, tag.title tag_title
FROM article a
LEFT JOIN article_tag x ON a.id = tag.article
LEFT JOIN tag ON tag.id = x.tag
WHERE tag.title = 'someTag'
) q
GROUP BY q.id
Postgresはq.body
がGROUP BY
に含まれなければならないことを要求し、上記の実行:サブクエリq
にはないので、私はそれを理解したよう
ERROR: column "q.body" must appear in the GROUP BY clause or be used in an aggregate function
、それはですPRIMARYキーを含めます。
私はまったくDISTINCT ON
がそれを補うと思っていましたが、そうは思われません。
GROUP BY
節にすべての列をリストする必要がないように、サブクエリの列をPRIMARYとしてマークする方法はありますか?
の場合にはすべての列をGROUP BY
節に記載する必要がありますが、これには相当なコストがかかりますか?
EDIT:詳しく説明するため、GROUP BY
を使用する場合PostgreSQL 9.1のであなたは、例えば、供給ノンプライマリ(すなわち機能依存)キーを持っていないクエリを次は正常に動作します:私は(何とかq.id
が主キーであることを示すことによって)サブクエリと同じ動作、しかしを活用することができれば、私は思っていた
SELECT a.id, a.body, STRING_AGG(tag.title, '|') tags
FROM article a
LEFT JOIN article_tag x ON a.id = tag.article
LEFT JOIN tag ON tag.id = x.tag
GROUP BY a.id
。
可能な重複https://stackoverflow.com/questions/4611897/group-by-aggregate-function-confusion-in-sql) – waka
集計関数を使用するため、すべての非集計列をグループ化する必要があります。 – eurotrash
は、GROUP BYで非主キーを指定する必要がないことを意味するように編集しました(したがって、上記の質問と重複しない理由) – Dwelle