2016-05-30 10 views
1

Informix階層型SQLクエリには少し助けが必要です。私は成功し、次のクエリを実行することができています階層内の任意の子を指定すると、INFORMIX階層型SQLで完全ツリーをフェッチします

create table empl_relation (
employee_id char(10), 
manager_id char(10)); 

employee_id  | manager_id 
5148    null    
5149    5148 
5150    5149 
5151    5148 
5152    5151 
5154    5148 
5155    5154 

SELECT employee_id, manager_id FROM empl_relation 
    START WITH employee_id = 5148 
    CONNECT BY PRIOR employee_id = manager_id 
    ORDER SIBLINGS BY employee_id; 

上記の表で指定された正確な階層を返し、私は次のような構造を持つテーブルがあります。しかし、私はここで何か違うものを達成しようとしています。私は階層内の任意の従業員IDが入力として与えられたときと同じ結果セットを得ることを試みています。たとえば、クエリで、入力employee_idとして5154を指定すると、すべての親とその子、および入力従業員IDの子と孫を取得できるはずです。正確に言えば、上記のクエリを実行することで得たのと同じ結果セットが必要です。

単一のクエリで達成することは可能ですか?はいの場合は、これを達成するのを手伝ってもらえますか?

      EDIT 

[OK]を、私はこれを達成する1つの方法を考え出しましたが、次のように、それは2つのクエリを実行する必要:

SELECT employee_id, manager_id FROM empl_relation 
    START WITH employee_id = 5150 
    CONNECT BY employee_id = PRIOR manager_id 
    ORDER SIBLINGS BY employee_id ; 

返される:

employee_id  | manager_id 
5148  
5149     5148 
5150     5149 

その後、我々が取得することができますアプリケーション層の親employee_idに結果セットを反復し、次に下のクエリを実行して完全な階層ツリーを取得します:

SELECT employee_id, manager_id FROM empl_relation 
    START WITH employee_id = 5148 
    CONNECT BY PRIOR employee_id = manager_id 
    ORDER SIBLINGS BY employee_id; 

これはうまくいきますが、これを1回のクエリで達成できれば本当に素晴らしいことになります。

答えて

2

、私は少し短いバージョンを思い付きました

SELECT employee_id,manager_id FROM empl_relation 
START WITH employee_id = 
(SELECT employee_id 
    FROM empl_relation er 
    WHERE er.manager_id IS NULL 
    START WITH employee_id = 5150 CONNECT BY employee_id = 
    PRIOR manager_id) 
CONNECT BY 
PRIOR employee_id = manager_id 
ORDER BY employee_id; 

これはうまくいくようです。

+1

もっと簡潔な方法があるはずですが、構文エラーが出ていました。よくやった。 –

+0

サンプルデータに対して実際にこのクエリを実行すると、 "-284:サブクエリが正確に1つの行を返しませんでした"というエラーが表示されます。私がちょうどサブクエリを実行するとき、私はエラー "-324:あいまいな列(manager_id)"を得るということがさらに独特です。サブクエリの選択リストに 'manager_id'が含まれている場合、あいまいな列の問題は「消えます」:SELECT employee_id、manager_id FROM empl_relation WHERE manager_id IS NULL START WITH employee_id = 5150 CONNECT BY employee_id = PRIOR manager_id'しかし、メインクエリで直接使用することはできません。テスト:Mac OS X 10.11.5のInformix 12.10.FC6。コメント? –

+0

私はここで何が起こっているのか正確にはわかりません。 '、EMPLOYEE_ID WITH empl_relation 開始からMANAGER_IDをEMPLOYEE_IDを選択= は PRIOR EMPLOYEE_ID = MANAGER_ID BY CONNECT(er.manager_idはEMPLOYEE_ID = PRIOR MANAGER_ID BY EMPLOYEE_ID = 5150 CONNECT WITH START NULL IS empl_relationのER FROM EMPLOYEE_ID 選択します) ORDER BY employee_id; '内側のクエリにテーブルのエイリアスを置くと、あいまいな列の問題がなくなります。もう一度、ここで何が起こっているのか分からない。 – user3244615

2

これは、一つに、あなたの2つのクエリを組み合わせて動作するようです:

SELECT employee_id, manager_id FROM empl_relation 
START WITH employee_id = (
        SELECT h.employee_id 
         FROM (SELECT employee_id, manager_id 
           FROM empl_relation 
          START WITH employee_id = 5150 
          CONNECT BY employee_id = PRIOR manager_id 
          ) AS h 
        WHERE h.manager_id IS NULL) 
CONNECT BY PRIOR employee_id = manager_id 
ORDER BY employee_id; 

基本的に、これは階層を動作し、それを実行しているクエリをとり、その後、トップマネージャー(従業員を取得するために、結果をフィルタリングマネージャーなし)、その値を「トップダウンからの階層下降」クエリのSTARTとして使用します。

5148 
5149 5148 
5150 5149 
5151 5148 
5152 5151 
5154 5148 
5155 5154 

私は任意の初期値と同じ結果を得る:5148、5149、5150、5151、5152、5154、ジョナサンの返信に触発5155.

+0

うわー!!!!それは完璧にうまくいった!あなたの助けをありがとう! – user3244615