2016-11-11 4 views
2

複雑なCASEステートメントを階層データセットに書き込もうとしています。複雑なHieraechical Traversing inside CaseステートメントT-SQL

これは、サンプルデータを持つテーブルである:

Level Parent  Child  IsDirector 
---------------------------------------- 
0  NULL  SteveJobs  NO 
1  SteveJobs TimCook  YES 
2  TimCook Greg   NO 
3  Greg  Mark   NO 
4  Mark  Jack   NO 
4  Mark  Kim   NO 
4  Mark  Tyler   NO 
4  Mark  Emma   NO 

私は人のディレクターを見つけるために、SQLクエリを記述しようとしています。私が金さんに問い合わせると、結果はこうなるはずです。

Parent Child Director  
------------------------- 
Mark Kim  TimCook 

ここに私が書いた質問があります。

SELECT 
    A.Parent, A.Child, 
    CASE A.IsDirector 
     WHEN 'YES' 
      THEN A.Child 
     WHEN 'NO' 
      THEN CASE 
        WHEN (A.IsDirector = 'NO' AND A.Parent IS NOT NULL) 
         THEN A.Parent 
         ELSE (SELECT 
           CASE WHEN B.IsDirector = 'YES' 
             THEN B.Parent 
           END AS Director 
          FROM @Org B 
          WHERE B.Child = A.Parent) 
       END 
    END AS Director, 
    A.IsDirector 
FROM 
    @Org A 
WHERE 
    Child = 'Kim' 

結果は以下

Parent Child Director IsDirector 
------------------------------------ 
Mark Kim  Mark  NO 

SQLフィドルです。申し訳ありませんが、上記のコードをどのようにフォーマットするのか分かりません。

http://sqlfiddle.com/#!6/b5830

+0

だから、dアイレクターは常に親の上のレコードですか?より良い質問:「ディレクター」を決定するもの – xQbert

+0

誰でもディレクターになることができますが、ディレクターは常に親を持たない親の子になります。私が提供した上記の表では、レベル1として別のレコードが存在する可能性があります。簡単な答え:レベル1は常にディレクターになり、レベル0には親が決してありません。これがあなたの質問に答えるかどうか私に教えてください。 –

答えて

0

おそらく、再帰CTEを有する

Declare @YourTable table (Level int,Parent varchar(50),Child varchar(50),IsDirector varchar(50)) 
Insert into @YourTable values 
(0,NULL,'SteveJobs','NO'), 
(1,'SteveJobs','TimCook','YES'), 
(2,'TimCook','Greg','NO'), 
(3,'Greg','Mark','NO'), 
(4,'Mark','Jack','NO'), 
(4,'Mark','Kim','NO'), 
(4,'Mark','Tyler','NO'), 
(4,'Mark','Emma','NO') 

Declare @Fetch varchar(50)='Kim' 

;with cteHB as (
     Select Child 
      ,Parent 
      ,Lvl=1 
      ,Director=case when IsDirector='Yes' then Child else '' end 
     From @YourTable 
     Where [email protected] 
     Union All 
     Select R.Child 
      ,R.Parent 
      ,P.Lvl+1 
      ,Director=case when IsDirector='Yes' then R.Child else '' end 
     From @YourTable R 
     Join cteHB P on P.Parent = R.Child) 
Select A.* 
     ,B.Director 
From @YourTable A 
Join cteHB B on ([email protected] and Director<>'') 

戻り

Level Parent Child IsDirector Director 
4  Mark Kim  NO   TimCook 

楽しみのためだけに、パスを見て、あなたは、ファイルがでSELECT置き換えることができ

Select Lvl = Row_Number() over (Order By Lvl Desc) 
     ,Child 
     ,Parent 
     ,Director 
From cteHB 
Order By 1 
+0

これが最も効果的な方法です。私は実際の生活のシナリオでこれを試していません。これを試して、この作品があればお知らせします。ところで、どうやってあなたや何かを推薦することができますか?あなたの迅速で効果的な返信が本当に好きです。 –

+0

@gopinath簡単な感謝は私が必要以上にあります。乾杯 –

+0

私はこのコードを試して、特定の子供を照会するとうまくいきます。しかし、私は親の子のディレクターの結果を表示するには、cteHBからSelect *を行うこの非常にコードをカスタマイズしたいと思います。私はLvlを気にしませんが、それを持っているのは良いことです。変数とwhere句を削除しようとしましたが、期待した結果が得られませんでした –

関連する問題