想法是查詢article
表,其中文章有給定的tag
,然後到STRING_AGG
屬於該文章行的所有(甚至不相關的)標籤。從子查詢中進行選擇,而不必指定GROUP BY中的所有列
示例表和查詢:
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
:
ERROR: column "q.body" must appear in the GROUP BY clause or be used in an aggregate function
據我瞭解,這是因爲子查詢q
不包括任何主鍵。
我天真地認爲DISTINCT ON
會補充,但它似乎並不如此。
是否有辦法將子查詢中的列標記爲PRIMARY,以便我們不必列出GROUP BY
子句中的所有列?
如果我們做必須列出GROUP BY
子句中的所有列,這是否會產生顯着的性能費用?
編輯:闡述,因爲你PostgreSQL 9.1不必供給非主(即功能上依賴)鍵使用GROUP BY
時,例如下面的查詢工作正常:
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
我在想,如果我可以利用相同的行爲,但與子查詢(通過某種方式,表明q.id
是主鍵)。
[SQL中GROUP BY /聚合功能混亂(的可能的複製https://stackoverflow.com/questions/4611897/group-by-aggregate-function-confusion-in-sql) – waka
由於使用聚合函數,您必須對所有非聚合列進行分組。 – eurotrash
編輯,以闡明我的意思是不必在GROUP BY中指定非主鍵(因此爲什麼它不是上述問題的重複) – Dwelle