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 ответов


SELECT
  *
FROM
  myTree
WHERE
  path @> (
    SELECT
      path
    FROM
      myTree
    WHERE
      label = 'C'
  );

что-то вроде этого:

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');

SQL Fiddle

возможно, есть лучший способ использовать встроенные вещи.