我有一个SQL查询(在PostgreSQL数据库上)递归遍历友谊表:
WITH RECURSIVE friendship(pID, distance, path) AS (
(SELECT pID1, 1, CONCAT(getName(pID2), '->', getName(pID1))
FROM pkp_symmetric WHERE pID2 = 94)
UNION
(SELECT sym.pID1, distance + 1, CONCAT(path, '->', getName(sym.pID2))
FROM pkp_symmetric sym JOIN friendship f ON sym.pID2 = f.pID WHERE distance < 5)
)
SELECT getName(f.pID), min(f.distance), f.path
FROM friendship f
WHERE f.pID <> 94
GROUP BY f.pID;
getName(pID)
只是一个帮助函数,可以打印出名称,而不是ID
&#39}。
此查询将给出错误,因为f.path
需要位于GROUP BY
- 子句或聚合函数中(SQL状态:42803)。但是,如上所述,我需要按f.pID
对此查询进行分组。
是否有一种解决方法可以将f.path
引入select
,但不对其进行分组?
非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用distinct on
:
SELECT DISTINCT ON (f.pId) getName(f.pID), f.distance, f.path
FROM friendship f
WHERE f.pID <> 94
ORDER BY f.pID, f.distance