7

形式の階層テーブルがあります

CREATE TABLE tree_hierarchy (
  id        NUMBER (20)
 ,parent_id NUMBER (20)
);


INSERT INTO tree_hierarchy (id, parent_id) VALUES (2, 1);
INSERT INTO tree_hierarchy (id, parent_id) VALUES (4, 2);
INSERT INTO tree_hierarchy (id, parent_id) VALUES (9, 4);

クエリを実行すると:-

SELECT id,parent_id,
  CONNECT_BY_ISLEAF leaf,
  LEVEL,
  SYS_CONNECT_BY_PATH(id, '/') Path,
  SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path
FROM tree_hierarchy
WHERE CONNECT_BY_ISLEAF<>0
  CONNECT BY PRIOR id = PARENT_id
ORDER SIBLINGS BY ID;

私が得ている結果は次のようなものです:-

"ID"    "PARENT_ID" "LEAF"  "LEVEL" "PATH"  "PARENT_PATH"

9            4         1       3    "/2/4/9"  "/1/2/4"

9            4         1       2     "/4/9"     "/2/4"

9            4         1       1      "/9"      "/4"

しかし、これだけを取得するOracle Sqlクエリが必要です

"ID"    "PARENT_ID" "LEAF"  "LEVEL" "PATH"  "PARENT_PATH"

9            4         1       3    "/2/4/9"  "/1/2/4"

これは、このような方法で 1000 を超えるレコードがある簡単な例です。上記のクエリを実行すると、多くの重複が生成されます。重複なしでリーフからルートへの完全なパスを提供する一般的なクエリを教えてください。ありがとう事前に助けを求める

4

2 に答える 2

5

有限階層のルート ノードは常に既知である必要があります。定義: http://en.wikipedia.org/wiki/Tree_structureによると 、ルート ノードは親を持たないノードです。特定のノードがルート ノードであるかどうかを確認するには、「parent_id」を取得し、この ID を持つレコードが存在するかどうかをテーブルで確認します。クエリは次のようになります。

SELECT id,parent_id,
  CONNECT_BY_ISLEAF leaf,
  LEVEL,
  SYS_CONNECT_BY_PATH(id, '/') Path,
  SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path
FROM tree_hierarchy th
WHERE CONNECT_BY_ISLEAF<>0
  CONNECT BY PRIOR id = PARENT_id
START WITH not exists (
      select 1 from tree_hierarchy th1 
      where th1.id = th.parent_id
  )
ORDER SIBLINGS BY ID;
于 2013-07-12T16:52:08.973 に答える