我们有具有树状层次结构的表:
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,但它比当前的解决方案慢。
发布于 2018-01-28 16:53:14
如果你坚持你的设计,你可以把它重写成:
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);https://stackoverflow.com/questions/48484645
复制相似问题