使用单个SQL查询构建分层树

Mar*_*rio 2 sql database hierarchical-data

我有一个具有以下结构的SQL表.

id   - int
par  - int (relational to id)
name - varchar
Run Code Online (Sandbox Code Playgroud)

如果没有引用,列par包含对idNULL的引用,此表用于构建分层树.

然后,给出数据:

id par  name

1  NULL John
2  NULL Mario
3  1    George
4  3    Alfred
5  4    Nicole
6  2    Margaret
Run Code Online (Sandbox Code Playgroud)

我想从给定的单个id中检索一个分层树,直到最后一个父.

例如,我想知道从Nicole到最后一位父亲的树.所以查询结果将是:

id par  name

5  4    Nicole
4  3    Alfred
3  1    George
1  NULL John
Run Code Online (Sandbox Code Playgroud)

我通常会在SQL查询中反复重复并构建树服务器端,但我现在不想这样做.

有没有办法用单个SQL查询实现这一点?
我需要MySQL或PgSQL.

而且我想知道,如果可能的话,它是否也受到广泛支持?我希望支持MySQL或PgSQL的哪个版本?

a_h*_*ame 6

Postgres中的单个查询可以使用递归公用表表达式.这在MySQL中是不可能的,因为它是少数不支持递归CTE的数据库之一.

它看起来像这样(未经测试)

WITH RECURSIVE tree (id, par, name) AS (
    SELECT id, par, name 
    FROM the_table
    WHERE name = 'Nicole'

    UNION ALL

    SELECT id, par, name 
    FROM the_table tt
      JOIN tree tr ON tr.id = tt.par
)
SELECT *
FROM tree
Run Code Online (Sandbox Code Playgroud)