2016-11-08 11 views
0

SQL Serverを使用しています。階層別T-SQL検索

私は2つの整数の列を持つテーブルのグループがあります。

MEGR_KEY 
MEGR_KEY1 

MEGR_KEYは、グループの主キーです。各グループはサブグループを持つことができます。例えば

- 私はグループの1195持っている:

MEGR_KEY = 1195

1195のサブグループがあります。

MEGR_KEY = 9484  
MEGR_KEY1 = 1195 

MEGR_KEY = 7494 
MEGR_KEY1 = 1195 

基本的MEGR_KEY1が語っています、どちらのグループは親です。

問題は、すべてMEGR_KEYサブグループを階層的に見つける方法です。ルートグループ名のみを指定してください。前の例から1195のルートグループがあるとします。すでに7494と9484の2つのサブグループがあります。これらの2つのサブグループは、他のグループの親グループでもあります。だから、私は行を見つける必要がありますMEGR_KEY1 = 7494またはMEGR_KEY1 = 9484.グループ番号(MEGR_KEY)が与えられている場合、すべてのサブグループを見つける方法?私はここでこれに対する質問を書いている問題があります。あなたのケースでは

+1

テイクAになります再帰的な自己結合を見る – rbr94

答えて

2

はスキーマ

CREATE TABLE #TAB (MEGR_KEY INT, NAME VARCHAR(50), MEGR_KEY1 INT) 

    INSERT INTO #TAB 
    SELECT 19 , 'Name1' , 0 
    UNION ALL 
    SELECT 20 ,'Name2' , 19 
    UNION ALL 
    SELECT 21 , 'Name3' , 20 
    UNION ALL 
    SELECT 22 , 'Name4' , 21 
    UNION ALL 
    SELECT 23 , 'Name5' , 21 
    UNION ALL 
    SELECT 26 , 'Name6' , 19 
    UNION ALL 
    SELECT 28 , 'Name7' , 0 
    UNION ALL 
    SELECT 29 , 'Name7' , 18 
    UNION ALL 
    SELECT 30 , 'Name8' , 18 

を構築することができます今すぐ

DECLARE @MEGR_KEY INT=19; 

    ;WITH CTE AS(
    SELECT * FROM #TAB WHERE MEGR_KEY= @MEGR_KEY 
    UNION ALL 
    SELECT T.* FROM #TAB T 
    INNER JOIN CTE C ON T.MEGR_KEY1 = C.MEGR_KEY 
    ) 
    SELECT * FROM CTE 

(私は再帰CTEを取った)表を照会し、その結果は

enter image description here