如果你有一个表层次结构,表中的每个项目都包含对父表中父项id的引用,那么有没有办法从单个(少数)sql查询中获取树作为树?
看起来像:
SELECT *
FROM specy
JOIN genus ON genus.id=specy.genus
JOIN family ON genus.family=family.id
但即使这在语法上是正确的,它是否会为该族的每个属返回一个带有族字段的数据集,并且该属的每个种类的家族和属字段都会返回?
SQL可以直接(轻松)返回一个分层树,还是只返回一个我必须用另一种语言处理的数据集?
是的,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;
如果您不想查看冗余信息,可以按族和属来订购结果,然后使用用户变量用空格替换上一行的重复项。然后,只有当它们发生变化时才能看到它们的属性和属名。
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