如何在一个SQL查询中从层次结构中查找子级和父级

时间:2018-01-28 08:48:37

标签: sql postgresql

我们有树层次结构的表:

id, path
1, "/1/"
2, "/1/2/"
3, "/1/2/3/"
4, "/1/2/3/4/"
5, "/1/5/"
6, "/1/5/6/"

id - int, path - string. 

表中没有父级和深度的任何参考。

那么问题,如何让孩子和父母为任何元素?当前解决方案看起来像SELECT * FROM table WHERE ((path LIKE '/1/2/' || '%') OR ('/1/2/' LIKE path || '%'));。它很慢,可以通过PostgreSQL索引进行优化(查询的第二部分,第一部分由GIN索引优化)。

我尝试使用inner join,但它比当前解决方案慢。

1 个答案:

答案 0 :(得分:0)

如果您坚持使用您的设计,可以将其重写为:

SELECT * 
FROM table 
WHERE path LIKE '/1/2/' || '%'
UNION ALL
SELECT * 
FROM table 
WHERE '/1/2/' LIKE path || '%';

path添加索引。

CREATE INDEX index_name ON table(path);