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

时间:2011-08-31 15:57:35

标签: sql database hierarchical-data

我有一个 SQL 表,其结构如下。

id   - int
par  - int (relational to id)
name - varchar

par 包含对 id NULL 的引用(如果没有引用),此表用于构建分层树。

然后,给出数据:

id par  name

1  NULL John
2  NULL Mario
3  1    George
4  3    Alfred
5  4    Nicole
6  2    Margaret

我想从给定的单个 id 中检索最后一个父级的分层树。

示例,我想知道从 Nicole 到最后一个父树的树。所以查询结果将是:

id par  name

5  4    Nicole
4  3    Alfred
3  1    George
1  NULL John

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

有没有办法通过单个SQL查询来实现这一点? 我需要MySQL或PgSQL。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

对于Postgres,请参阅http://www.postgresql.org/docs/8.4/static/queries-with.html

MySQL不支持这种语法(除非它在某个地方的beta / development树中)。 Oracle使用connect by prior具有类似的功能。

答案 2 :(得分:0)

在Oracle中,这可以通过以下方式完成:

SELECT [[LEVEL,]] id, par, name FROM my_table
 START WITH name = 'Nicole'
CONNECT BY [[NOCYCLE]] id = PRIOR par
[[ORDER SIBLINGS BY name ASC]]

(我的[[…]]语法表示可选的查询位。

MySQL计划整合这样的功能。对于PostgreSQL,有另一个答案可以帮助你。

答案 3 :(得分:0)

这篇文章可能就是您需要关注的内容:

http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/