sql从分层表中获取树

问题描述 投票:0回答:2

如果你有一个表层次结构,表中的每个项目都包含对父表中父项id的引用,那么有没有办法从单个(少数)sql查询中获取树作为树?

  • specy(id,name,genus)
  • 属(id,name,family)
  • 家庭(身份证,姓名)

看起来像:

SELECT *
FROM specy
JOIN genus ON genus.id=specy.genus
JOIN family ON genus.family=family.id

但即使这在语法上是正确的,它是否会为该族的每个属返回一个带有族字段的数据集,并且该属的每个种类的家族和属字段都会返回?

SQL可以直接(轻松)返回一个分层树,还是只返回一个我必须用另一种语言处理的数据集?

sql
2个回答
1
投票

是的,SQL可以使用common table expressions (CTEs)返回分层数据,但并非所有数据库都支持CTE。语法是:

WITH [RECURSIVE] with_query [, ...]
SELECT...

例:

WITH RECURSIVE table1 (n, fact) AS 
(SELECT col1+1, col1*col2 FROM table1)
SELECT * FROM table1;

0
投票

如果您不想查看冗余信息,可以按族和属来订购结果,然后使用用户变量用空格替换上一行的重复项。然后,只有当它们发生变化时才能看到它们的属性和属名。

SELECT CASE WHEN f.id = @prev_family THEN '' ELSE f.name END AS family,
       CASE WHEN g.id = @prev_genus THEN '' ELSE g.name END AS genus,
       s.name AS species
FROM specy AS s
JOIN genus AS g ON s.genus = g.id
JOIN family AS f ON g.family = f.id
CROSS JOIN (SELECT @prev_family := 0, @prev_genus := 0) AS vars
ORDER BY f.id, g.id, s.id
© www.soinside.com 2019 - 2024. All rights reserved.