DB2 递归

DB2反向递归拿到所有部门
WITH
    ROOT 
    (
        CODE,
        CUSTOM_CODE,
        FULL_NAME,
        ID,
        NAME,
        PARENT_CODE,
        PY_CODE,
        LEVEL,
        PARENT_NAME) AS (   SELECT
                                A.CODE,
                                A.CUSTOM_CODE,
                                A.FULL_NAME,
                                A.ID,
                                A.NAME,
                                A.PARENT_CODE,
                                A.PY_CODE,
                                A.LEVEL,
                                A.PARENT_NAME 
                            FROM
                                VIEW_INST_DEPART_CLASSIFY_LEVEL A 
                            WHERE
                                A.CODE IN ( SELECT
                                                DISTINCT B.DEPARTMENT_CODE 
                                            FROM
                                                MEDICAL_WORKER B 
                                            WHERE
                                                1=1 AND
                                                B.INST_CODE= '467223275' 
                                )
                            UNION
                                ALL SELECT
                                        A.CODE,
                                        A.CUSTOM_CODE,
                                        A.FULL_NAME,
                                        A.ID,
                                        A.NAME,
                                        A.PARENT_CODE,
                                        A.PY_CODE,
                                        A.LEVEL,
                                        A.PARENT_NAME 
                                    FROM
                                        VIEW_INST_DEPART_CLASSIFY_LEVEL a,
                                        ROOT R
                                    WHERE
                                        A.CODE = R.PARENT_CODE 
        )
SELECT
    DISTINCT CODE,
    CUSTOM_CODE,
    FULL_NAME,
    ID,
    NAME,
    PARENT_CODE,
    PY_CODE,
    LEVEL,
    PARENT_NAME 
FROM
    ROOT
WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 mla_id 为 任意传进去的参数 的一行或多行。 

第二个 SELECT 语句执行多次。将种子作为输入(JOIN 中的辅助表)传递给第二个 SELECT 语句以产生下一个行集合。将 JOIN 的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。 
posted @ 2011-04-12 15:20  骨头  阅读(708)  评论(0编辑  收藏  举报