PostgreSQL ltree найти все предки данной метки (не путь)
у меня есть таблица со столбцом пути ltree. В моей иерархии путь к метке уникален, что означает, что каждая метка имеет ровно одну родительскую метку. Другими словами, в таблице нет двух путей ltree, которые заканчивались бы одной и той же меткой.
у меня есть ярлык ltree, скажем, "C".
Я могу найти все строки потомков этой метки со следующим запросом:
select * from myTree where path ~ '*.C.*';
это отлично работает и дает правильное поддерево.
теперь мне нужно реализуйте запрос, чтобы найти все строки предков данной метки. Я имею в виду, если в таблице есть, например, 3 строки с метками "A", "A. B", "A. B. C", я хотел бы получить строки с путями "A" и "A. B" (возможно, включая сам "A. B. C", пока не имеет значения).
Если я знаю полный путь "C" ("A. B. C" в приведенном выше примере), то задача проста с @>
оператора. Однако теперь я знаю только "C", и все же я хотел бы выполнить задачу с помощью одного запроса. Есть есть ли способ сделать это?
2 ответов
что-то вроде этого:
WITH r AS
(
SELECT *, row_number() OVER (ORDER BY path) rn
FROM myTree
)
SELECT *
FROM r
WHERE rn <= (SELECT rn FROM r WHERE path ~ '*.C');
возможно, есть лучший способ использовать встроенные вещи.