Oracleで再帰照会を使用してすべての子ノードを照会する方法
Oracleでは、結合クエリや再帰副問合せを使用してすべての孫ノードに再帰的にクエリをかけることができます。以下は、再帰副問合せを使用した例です。
- 従業員のIDと上司のIDのフィールドを含むemployee表などのテーブルを作成します。
CREATE TABLE employee (
id NUMBER,
parent_id NUMBER
);
- サンプルのデータを入力する
INSERT INTO employee (id, parent_id)
VALUES (1, NULL);
INSERT INTO employee (id, parent_id)
VALUES (2, 1);
INSERT INTO employee (id, parent_id)
VALUES (3, 1);
INSERT INTO employee (id, parent_id)
VALUES (4, 2);
- 再帰サブクエリを使用して、すべての子ノードを照会します。
WITH recursive_query (id, parent_id) AS (
SELECT id, parent_id FROM employee WHERE id = 1 -- 指定根节点的id
UNION ALL
SELECT e.id, e.parent_id FROM employee e
JOIN recursive_query r ON e.parent_id = r.id
)
SELECT * FROM recursive_query;
上記例では、再帰副問い合わせを使用して「employee」テーブルのIDが1のノードのすべての子ノードを照会しています。再帰副問い合わせ部分は、2つのSELECT文をUNION ALLで連結しています。最初のSELECT文は指定したIDのノードを返し、2番目のSELECT文はJOINを使用して再帰的に問い合わせた結果と元のテーブルとを接続することで、再帰的な問い合わせを実現しています。