【问题标题】:Postgresql: more than one row returned by a subquery used as an expression?Postgresql:用作表达式的子查询返回多行?
【发布时间】:2020-09-01 15:33:36
【问题描述】:

我有一个查询要查找家谱中最年轻的一代。 这是我的数据库

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

或者如果结果返回单行

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

如何解决这个问题?还有一个问题是有没有办法使用窗口功能获得结果?

【问题讨论】:

    标签: sql postgresql recursive-query


    【解决方案1】:

    递归计算生成,然后得到匹配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); 
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2018-02-13
      相关资源
      最近更新 更多