我有一个 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?
答案 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/