Forum Stats

  • 3,853,628 Users
  • 2,264,247 Discussions
  • 7,905,419 Comments

Discussions

再帰クエリについて

user5799127
user5799127 Member Posts: 7
edited May 7, 2016 9:22AM in SQLとPL/SQL

環境:OracleDB 10.2.0.5

以下の表から、

従業員コード 上司コード

00003   00001

00004   00003

00007   00004

00005   00001

00006   00002

従業員コードを1つ設定して、

00003   00001

00004   00003

00007   00004

のデータを取得するSQL文を書く場合、どのようにしたらよいでしょうか?

まずは、以下のような自己結合で実行してみましたが、

従業員コードに00003を指定した場合、「00003   00001」の値が取得できませんでした。

SELECT
部下.従業員コード,
    上司.上司コード
FROM 従業員 AS 部下
JOIN 従業員 AS 上司
ON 部下.上司コード = 上司.従業員コード
WHERE 部下.従業員コード = '[条件値]'

また、以下の再帰クエリを実行してみましたが、

従業員コードに00004を指定した場合、「00007   00004」の値が取得できませんでした。
SELECT
従業員コード,
    上司コード
FROM 従業員
START WITH 従業員コード = '[条件値]'
CONNECT BY 従業員コード = PRIOR 上司コード

Tagged:

Answers

  • Aketi Jyuuzou
    Aketi Jyuuzou Member Posts: 1,072 Bronze Badge
    edited May 7, 2016 9:22AM

    図でイメージするOracleのSQL全集 第6回 階層問い合わせ

    http://www.oracle.com/technetwork/jp/articles/otnj-sql-image6-1352143-ja.html

    のconnect by NoCycleを見ながら、

    UnionFindチックな階層問い合わせをしてみました

    [code]

    with t(従業員コード,上司コード) as(

    select '00003','00001' from dual union

    select '00004','00003' from dual union

    select '00007','00004' from dual union

    select '00005','00001' from dual union

    select '00006','00002' from dual)

    select 従業員コード,上司コード

      from t

    start with 従業員コード = '00004'

    connect by NoCycle prior 上司コード   = 従業員コード

                    or prior 従業員コード = 上司コード;

    従業員コード  上司コード

    ------------  ----------

    00004         00003

    00003         00001

    00007         00004

    [/code]

This discussion has been closed.