首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql server中具有联合的递归查询

sql server中具有联合的递归查询
EN

Stack Overflow用户
提问于 2014-06-23 04:28:08
回答 1查看 367关注 0票数 1

我想将oracle查询转换为sql server。

但在sql server中,“在递归公共表表达式‘TEMP_TAB’的递归部分不允许使用UNION运算符。”出现错误。

我怎么能做到呢?

>> ORACLE查询

代码语言:javascript
复制
   SELECT TREE_ID,
          TREE_NM,
          TREE_LEV_CD,
          UP_TREE_ID,
          TREE_CD,
          TREE_LRK_RUF_ID,
          SCE_XRS_SEQ_VL
     FROM (
           SELECT TREE_ID, 
                  TREE_NM, 
                  TREE_LEV_CD, 
                  UP_TREE_ID,
                  TREE_CD,
                  TREE_LRK_RUF_ID,
                  SCE_XRS_SEQ_VL
             FROM SC_TREE_MASTER
            WHERE TREE_BJ_CD = '02' 
              AND USR_ID = 'ADMIN'
            UNION
           SELECT A.COL_ID TREE_ID,
                  A.COL_NM TREE_NM,
                  B.TREE_LEV_CD TREE_LEV_CD,
                  B.TREE_ID UP_TREE_ID,
                  B.TREE_CD TREE_CD,
                  A.SCM_ID TREE_LRK_RUF_ID,
                  '999' SCE_XRS_SEQ_VL
             FROM SC_COLUMN A,
                  SC_TREE_MASTER B
            WHERE A.SCM_ID = B.TREE_LRK_RUF_ID
              AND B.TREE_BJ_CD = '02'
              AND USR_ID = 'ADMIN'
           ) 
     START WITH UP_TREE_ID = 'TR00000000'
   CONNECT BY PRIOR TREE_ID = UP_TREE_ID
     ORDER SIBLINGS BY TREE_ID, SCE_XRS_SEQ_VL

>> SQL SERVER查询

代码语言:javascript
复制
WITH TEMP_TAB(
             TREE_ID,
             TREE_NM,
             TREE_LEV_CD,
             UP_TREE_ID,
             TREE_CD,
             TREE_LRK_RUF_ID,
             SCE_XRS_SEQ_VL,
             SORT,                         
             RECURSIVE_LEVEL) AS            
     (SELECT A.TREE_ID,
         A.TREE_NM,
         A.TREE_LEV_CD,
         A.UP_TREE_ID,
         A.TREE_CD,
         A.TREE_LRK_RUF_ID,
         A.SCE_XRS_SEQ_VL,
             CAST(CONCAT('-',A.TREE_ID) AS VARCHAR(100)),
             1 RECURSIVE_LEVEL
        FROM (
             SELECT TREE_ID, 
                    TREE_NM, 
                    TREE_LEV_CD, 
                    UP_TREE_ID,
                    TREE_CD,
                    TREE_LRK_RUF_ID,
                    SCE_XRS_SEQ_VL
               FROM SC_TREE_MASTER
              WHERE TREE_BJ_CD = '02' 
                AND USR_ID = 'ADMIN'
              UNION
             SELECT A.COL_ID TREE_ID,
                   A.COL_NM TREE_NM,
                   B.TREE_LEV_CD TREE_LEV_CD,
                   B.TREE_ID UP_TREE_ID,
                   B.TREE_CD TREE_CD,
                   A.SCM_ID TREE_LRK_RUF_ID,
                   '999' SCE_XRS_SEQ_VL
               FROM SC_COLUMN A,
                    SC_TREE_MASTER B
              WHERE A.SCM_ID = B.TREE_LRK_RUF_ID
                AND B.TREE_BJ_CD = '02'
                AND USR_ID = 'ADMIN'
                    ) A
       WHERE A.UP_TREE_ID = 'TR00000000'
      UNION ALL
      SELECT A.TREE_ID,
             A.TREE_NM,
             A.TREE_LEV_CD,
             A.UP_TREE_ID,
             A.TREE_CD,
             A.TREE_LRK_RUF_ID,
             A.SCE_XRS_SEQ_VL,
             CAST(CONCAT(B.SORT,'/',A.TREE_ID) AS VARCHAR(100)),
             RECURSIVE_LEVEL + 1
        FROM (
             SELECT TREE_ID, 
                    TREE_NM, 
                    TREE_LEV_CD, 
                    UP_TREE_ID,
                    TREE_CD,
                    TREE_LRK_RUF_ID,
                    SCE_XRS_SEQ_VL
               FROM SC_TREE_MASTER
              WHERE TREE_BJ_CD = '02' 
                AND USR_ID = 'ADMIN'
              UNION
             SELECT A.COL_ID TREE_ID,
                   A.COL_NM TREE_NM,
                   B.TREE_LEV_CD TREE_LEV_CD,
                   B.TREE_ID UP_TREE_ID,
                   B.TREE_CD TREE_CD,
                   A.SCM_ID TREE_LRK_RUF_ID,
                   '999' SCE_XRS_SEQ_VL
               FROM SC_COLUMN A,
                    SC_TREE_MASTER B
              WHERE A.SCM_ID = B.TREE_LRK_RUF_ID
                AND B.TREE_BJ_CD = '02'
                AND USR_ID = 'ADMIN'
                        ) A,
             TEMP_TAB B
       WHERE B.TREE_ID =A.UP_TREE_ID
     )
    SELECT  TREE_ID, 
        TREE_NM, 
        TREE_LEV_CD, 
        UP_TREE_ID,
        TREE_CD,
        TREE_LRK_RUF_ID,
        SCE_XRS_SEQ_VL
    FROM TEMP_TAB M 
    ORDER BY SORT
EN

回答 1

Stack Overflow用户

发布于 2014-12-24 14:35:27

T中的递归CTE要求使用'UNION ALL‘。如果需要“UNION”的行为,则在外部查询中使用关键字'DISTINCT‘。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24358386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档