按层次结构

时间:2016-11-08 11:39:09

标签: sql sql-server tsql

我正在使用SQL Server。

我有一个包含两个整数列的表:

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.现在,这两个子组也可以是其他组的父组。所以,我必须找到MEGR_KEY1 = 7494或MEGR_KEY1 = 9484的行。如果给出组号(MEGR_KEY),如何查找所有子组?我在这里写一个问题。

1 个答案:

答案 0 :(得分: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

现在查询表(我递归地接受了CTE)

    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

结果将是

enter image description here