Oracle データベースでは、特に大規模な階層データを扱う場合、ノードの子ノードのクエリは一般的な要件です。この記事では、Oracle の CONNECT BY ステートメントと SYS_CONNECT_BY_PATH 関数を使用して子ノードをクエリする方法を紹介します。
まず、CONNECT BY ステートメントを見てみましょう。 CONNECT BY ステートメントは Oracle の再帰クエリ ステートメントであり、ツリー構造または階層データのクエリを可能にします。 CONNECT BY を使用するには 2 つの方法があります。1 つは START WITH 句を使用してクエリの開始ノードを指定する方法で、もう 1 つは START WITH を省略する方法です。この場合、テーブル全体から再帰クエリが実行されます。
以下に、このクエリ方法を説明するための簡単な例を示します。従業員情報を含む "EMPLOYEE" という名前のテーブルがあるとします。従業員が所属する部門を表す "DEPT_ID" フィールドと、従業員の一意の ID を表す "EMP_ID" フィールドがあります。
次のステートメントを使用して、「DEPT_ID」が 100 であるすべての従業員をクエリできます:
SELECT * FROM EMPLOYEE START WITH DEPT_ID = 100 CONNECT BY PRIOR EMP_ID = MANAGER_ID;
このクエリ ステートメントは、「DEPT_ID」が 100 である従業員から始めて、部下の従業員を再帰的にクエリすることを意味します。ここで、「PRIOR」は上位再帰の従業員を示すキーワード、「MANAGER_ID」は従業員の上位レベルのマネージャーの ID を示すフィールドです。
クエリ結果では、「DEPT_ID」が100の全従業員とその配下の従業員の情報が確認できます。
ただし、この方法では各従業員のレベル情報、つまり各従業員のレベルはわかりません。このとき、SYS_CONNECT_BY_PATH 関数を使用して各ノードのフルパスを取得する必要があります。
以下は例です:
SELECT EMPLOYEE.*, LEVEL, SYS_CONNECT_BY_PATH(EMP_ID, '/') AS PATH FROM EMPLOYEE START WITH DEPT_ID = 100 CONNECT BY PRIOR EMP_ID = MANAGER_ID;
クエリ結果では、「/100/101/103」などの各従業員の完全なパス情報を確認できます。ここで、「/」はパス区切り文字、「LEVEL」は現在のノードの層レベルを示すシステム変数です。
さらに、他のメソッドを使用して子ノードをクエリすることもできます。たとえば、「WITH」キーワードを使用してパブリック式を作成し、それをクエリで使用できます。この方法は読みやすく、クエリ条件を簡単に組み合わせることができます。
つまり、CONNECT BY ステートメントと SYS_CONNECT_BY_PATH 関数を使用して、Oracle データベース内のノードの子ノードをクエリできます。実際のアプリケーションでは、より良い結果を得るために、特定のニーズに応じてさまざまなクエリ方法を選択できます。
以上がOracle で子ノードをクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。