Postgresql:用作表达式的子查询返回多于一行?
Postgresql: more than one row returned by a subquery used as an expression?
我有一个查询要在家谱中查找最年轻的一代。
这是我的数据库
ID NAME PARENT_ID
1 A 0
2 B 1
3 C 1
4 D 2
5 E 3
6 F 3
7 G 6
如果结果不止一行,我需要如下所示的输出
NAME GENERATIONS
E 4
F 4
或者如果结果 returns 单行
NAME GENERATIONS
G 5
这是我的查询:
WITH RECURSIVE children AS
(
SELECT id, name, parent_id
FROM family
UNION ALL
SELECT f.id, f.name, f.parent_id
FROM family f
INNER JOIN children c ON c.id = f.parent_id
)
SELECT
(
SELECT name
FROM family
WHERE id IS NOT NULL
AND parent_id =
(
SELECT MAX(parent_id) as maxpi
FROM family
)
) AS name,
COUNT(DISTINCT main.parent_id) AS generations
FROM family main
ORDER BY name
如何解决这个问题?另一个问题是有没有办法使用 window 函数获得结果?
递归时计算生成,然后得到匹配max(generation)
的行。
WITH RECURSIVE children AS (
SELECT id, name, parent_id, 1 as generation
FROM family
WHERE parent_id not in (SELECT id FROM family)
UNION ALL
SELECT f.id, f.name, f.parent_id, c.generation + 1 as generation
FROM family f
INNER JOIN children c ON c.id = f.parent_id
)
SELECT *
FROM children
WHERE generation = (select max(generation) from children);
我有一个查询要在家谱中查找最年轻的一代。 这是我的数据库
ID NAME PARENT_ID
1 A 0
2 B 1
3 C 1
4 D 2
5 E 3
6 F 3
7 G 6
如果结果不止一行,我需要如下所示的输出
NAME GENERATIONS
E 4
F 4
或者如果结果 returns 单行
NAME GENERATIONS
G 5
这是我的查询:
WITH RECURSIVE children AS
(
SELECT id, name, parent_id
FROM family
UNION ALL
SELECT f.id, f.name, f.parent_id
FROM family f
INNER JOIN children c ON c.id = f.parent_id
)
SELECT
(
SELECT name
FROM family
WHERE id IS NOT NULL
AND parent_id =
(
SELECT MAX(parent_id) as maxpi
FROM family
)
) AS name,
COUNT(DISTINCT main.parent_id) AS generations
FROM family main
ORDER BY name
如何解决这个问题?另一个问题是有没有办法使用 window 函数获得结果?
递归时计算生成,然后得到匹配max(generation)
的行。
WITH RECURSIVE children AS (
SELECT id, name, parent_id, 1 as generation
FROM family
WHERE parent_id not in (SELECT id FROM family)
UNION ALL
SELECT f.id, f.name, f.parent_id, c.generation + 1 as generation
FROM family f
INNER JOIN children c ON c.id = f.parent_id
)
SELECT *
FROM children
WHERE generation = (select max(generation) from children);