我有多个表,我需要从其中一个表中提取每个项目的父/子信息.因此,例如:

Table1:
| id | Name     | ParentIDFromTable2 | Weight | Height |
| 1  | Jack     | 5                  | 180    | 183    |
| 2  | Sparrow  | 3                  | 210    | 169    |
| 3  | John     | 6                  | 350    | 210    |
| 4  | Jill     | 2                  | 110    | 140    |
| 5  | Juliet   | 7                  | 122    | 150    |

Table2:
| id | Name     | GrandParentID     | Location |
| 1  | Adam     | 0                 | Earth    |
| 2  | Zack     | 1                 | Earth    |
| 3  | Noah     | 2                 | Earth    |
| 4  | Jacob    | 3                 | Earth    |
| 5  | Jeff     | 4                 | Earth    |
| 6  | Drake    | 5                 | Earth    |
| 7  | Kanye    | 3                 | Earth    |

因此,对于表1中的每一行,我希望能够提取完整的父子关系层次 struct 以及该行的属性,例如,对于表1条目:

ID=1;姓名=杰克,体重=180,身高=183,世系=地球/亚当/扎克/诺亚/雅各布/杰夫/杰克

ID=5&>姓名=朱丽叶,体重=122,身高=150,世系=地球/亚当/扎克/诺亚/坎耶/朱丽叶

我try 使用递归查找,但不知道如何从表2递归父ID

推荐答案

使用递归CTE和GROUP_CONCAT()窗口函数来连接位置:

WITH 
  target AS (SELECT * FROM Table1 WHERE id = 1),
  cte AS (
    SELECT *, 1 level FROM Table2 WHERE id = (SELECT ParentIDFromTable2 FROM target)
    UNION ALL
    SELECT t2.*, c.level + 1 
    FROM Table2 t2 INNER JOIN cte c
    ON c.GrandParentID = t2.id
  )
SELECT *,
      (SELECT Location || '/' || 
              GROUP_CONCAT(Name, '/') OVER (ORDER BY level DESC) FROM cte ORDER BY level LIMIT 1
      ) || '/' || Name Lineage
FROM target;

See the demo.

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

使用SQL旋转表的列(Snowflake)

如何连接第二个表并将其内容输入到第一个表的单个字段中?

如何在联接条件不匹配时按日期获取上一条记录

Lag()函数的差异:R与SQL(将R代码转换为SQL)

如何查询jsonb列是一个对象数组?

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

关于Postgres横向联接的谓词

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

同时插入和更新记录

SQL的左连接在多对多关系情况下使用

如何创建一个递归计数器来查找一个元素有多少父级和子级?

使用日期和间隔作为键加入 Athena 上的表?

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

添加一列并根据其他列值进行填充

SQL Server 查找存在于所有不同时期(或序列)中的条目

具有日期时间条件的存储过程

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

如何根据 Amazon Athena 中的多个列值删除重复行?

Lag() 获取snowflake的值变化