8

ltree パス列を持つテーブルがあります。私の階層では、ラベルへのパスは一意です。つまり、すべてのラベルには親ラベルが 1 つだけあります。つまり、テーブル内に同じラベルで終わる 2 つの ltree パスはありません。

ltree ラベルがあります。「C」としましょう。

次のクエリを使用して、このラベルのすべての子孫行を見つけることができます。

select * from myTree where path ~ '*.C.*';

これは正常に機能し、正しいサブツリーが得られます。

ここで、この特定のラベルの先祖行をすべて検索するクエリを実装する必要があります。たとえば、テーブルに「A」、「AB」、「ABC」というラベルの付いた 3 つの行がある場合、パス「A」と「AB」の行を取得したいと考えています (おそらく「ABC」自体を含む)。今のところ問題ありません)。

「C」(上記の例では「ABC」) のフル パスがわかっている場合、@>オペレーターの操作は簡単です。しかし、今は「C」しか知らないので、単一のクエリでタスクを達成したいと思っています。これを行う方法はありますか?

4

2 に答える 2

19
SELECT
  *
FROM
  myTree
WHERE
  path @> (
    SELECT
      path
    FROM
      myTree
    WHERE
      label = 'C'
  );
于 2014-11-26T11:46:14.787 に答える