当前位置: 代码迷 >> Oracle技术 >> 如何实现SQL栏目树
  详细解决方案

如何实现SQL栏目树

热度:808   发布时间:2014-03-13 20:21:52.0

/**
 * Desc: 取栏目树 ,过滤用户权限和无效栏目
 */


/** 1. 取某用户有权限(np_cms_column_security表有记录且t.action_1 = ’1′)的栏目的树 **/

createorreplaceviewV_NP_CTREE_BS as
selectB.* from(
selectA.*, lag(A.column_id) over(partition byA.column_id orderby0 ) RK
  from(select/*+choose */
         t.*
          fromnp_cms_column t
         wheret.is_active = '1'
        connectbypriort.column_id = t.parent_id
         start witht.column_id in(selectt.column_id
                                      fromnp_cms_column_security t
                                     wheret.subject_id = 'mazj'
                                          /*这里添加角色过滤*/
                                       andt.action_1 = '1'))A) B
 wherenotexists
 (select0
          from(selectdistinctd.column_id
                  fromnp_cms_column d
                connectbypriord.column_id = d.parent_id
                 start withd.column_id in
                    (selectt.column_id
                       fromnp_cms_column_security t
                      wheret.subject_id = 'mazj'
                           /* 这里添加角色过滤*/
                        andt.action_1 = '0'
                           /* 排除有权限树下的非授权ID,既 Action_1=0的*/
                        andexists
                      (select0
                               from(selectdistinctd.column_id
                                       fromnp_cms_column d
                                     connectbypriord.column_id =
                                                 d.parent_id
                                      start withd.column_id in
                                                 (selectt.column_id
                                                    fromnp_cms_column_security t
                                                   wheret.subject_id =
                                                         'mazj'
                                                        /*这里添加角色过滤*/
                                                     andt.action_1 = '1')) C1
                              whereC1.column_id = t.column_id))
                        andd.is_active = '1') C
         whereC.column_id = B.column_id andB.RK isnull) andB.RK isnull
unionall
selectc.*, 0 RK fromnp_cms_column c wherec.parent_id = 0;

————————————————————————
/** 2.得到栏目的虚拟父亲ID(考虑到把断层的节点接起来)**/

createorreplaceviewV_NP_CTREE_PA as
selectB.*,
       (caseB.column_id
         when1 then0 elsenvl(B.father, 1) end) VFA
  from(selectv.*,
               (selectvv.column_id
                  fromV_NP_CTREE_BS vv
                 wherevv.column_id = v.parent_id) FATHER
          fromV_NP_CTREE_BS v) B;

————————————————————————
/** 3. 取出门户需要的栏目树 **/

--create or replace view V_NP_CTREE_RS as
select
 D.*, LPAD(' ', 2 * level- 1) || SYS_CONNECT_BY_PATH(D.COLUMN_NAME, '/') "Path"
  from(selectc.*
          fromV_NP_CTREE_PA c
         orderbyc.VFA, c.disorder desc, c.column_id desc) D
connectbypriorD.column_id = D.VFA
 start withD.column_id = 1;

————————————————————————

  相关解决方案