最近做数据过滤觉得很有必要记录下整个过程,说不定下次就不知道了。

废话不多说开始:

表结构:

企业表(自关联,采用树的形式记录分子公司)

区域表(自关联,采用树的形式记录省/市/县/乡,数据量大)

公司管辖区域表(公司-区域的映射表,一对多,记录了公司所具有的管辖区域)

场景:根据自己的管辖区域构建区域查询条件

分子公司都有可能维护了管辖区域,上级具有下级的管辖权限(原因:上级公司有可能没有维护下级公司具有的管辖区域,而上级公司要管理下级就不需具有下级的管辖区域,所用需同时把下级的管辖区域给上级公司一次类推),在地址维护时,维护到任何级别都具有其下级区域的管辖(比如:某个公司维护了成都,它就具有成都和成都下的全部区域的管辖权限),维护到任何级别都具有该区域上级权限(比如:某个公司维护了成都/武侯区,那它就具有武侯区,成都,四川三个权限)

说到这是不是已经晕了,(拿到公司的管辖区域进行一次向上递归和一次向下递归然后合并结果集)

第一步:递归出子公司  (4319 是总部的id)

sql:SELECT *
        FROM C_COMPANY
          START WITH corp_id      =4319
          CONNECT BY prior corp_id= corp_parentid

结果:

第二步:拿出子公司的管辖区域  c_dealers_zone 管辖区域表1,c_store_zone 管辖区域表2

sql:SELECT zid
      FROM
        ( SELECT d.c_z_id AS zid ,d.c_com_id AS comid FROM c_dealers_zone d
        UNION
        SELECT s.csz_zid AS zid ,s.csz_sid AS comid FROM c_store_zone s
        )
      WHERE comid IN
        (SELECT corp_id
        FROM C_COMPANY
          START WITH corp_id      =4319
          CONNECT BY prior corp_id= corp_parentid
        )

结果:   表示4319和其下级公司已维护了的管辖区域。

第三步 将管辖区域id关联到区域信息表已拿出详细信息,并同时向上递归拿出上级(以便检索出下级)

sql:SELECT DISTINCT *
    FROM c_zone
      START WITH zone_id IN
      (SELECT zid
      FROM
        ( SELECT d.c_z_id AS zid ,d.c_com_id AS comid FROM c_dealers_zone d
        UNION
        SELECT s.csz_zid AS zid ,s.csz_sid AS comid FROM c_store_zone s
        )
      WHERE comid IN
        (SELECT corp_id
        FROM C_COMPANY
          START WITH corp_id      =4319
          CONNECT BY prior corp_id= corp_parentid
        )
      )
      CONNECT BY zone_id=prior zone_parent

结果:去重前:

第四步 将管辖区域向下递归(维护到某个区域表示具有该区域下级管辖)

sql:SELECT *
    FROM c_zone
      START WITH zone_id IN
      (SELECT zid
      FROM
        ( SELECT d.c_z_id AS zid ,d.c_com_id AS comid FROM c_dealers_zone d
        UNION
        SELECT s.csz_zid AS zid ,s.csz_sid AS comid FROM c_store_zone s
        )
      WHERE comid IN
        (SELECT corp_id
        FROM C_COMPANY
          START WITH corp_id      =4319
          CONNECT BY prior corp_id= corp_parentid
        )
      )
      CONNECT BY prior zone_id=zone_parent

结果:(维护到永州市就具有永州市的子集全部管辖)

第五步,将向上递归和向下递归合并结果集作为总部的管辖区域 ,加上where条件查询指定区域下的直接子集,0:中国

sql:SELECT *
FROM
  (SELECT   * from
    (SELECT *
    FROM c_zone
      START WITH zone_id IN
      (SELECT zid
      FROM
        ( SELECT d.c_z_id AS zid ,d.c_com_id AS comid FROM c_dealers_zone d
        UNION
        SELECT s.csz_zid AS zid ,s.csz_sid AS comid FROM c_store_zone s
        )
      WHERE comid IN
        (SELECT corp_id
        FROM C_COMPANY
          START WITH corp_id      =4441
          CONNECT BY prior corp_id= corp_parentid
        )
      )
      CONNECT BY prior zone_id=zone_parent
    )
  UNION
    ( SELECT  *
    FROM c_zone
      START WITH zone_id IN
      (SELECT zid
      FROM
        ( SELECT d.c_z_id AS zid ,d.c_com_id AS comid FROM c_dealers_zone d
        UNION
        SELECT s.csz_zid AS zid ,s.csz_sid AS comid FROM c_store_zone s
        )
      WHERE comid IN
        (SELECT corp_id
        FROM C_COMPANY
          START WITH corp_id      =4319
          CONNECT BY prior corp_id= corp_parentid
        )
      )
      CONNECT BY zone_id=prior zone_parent
    )
  )
WHERE zone_parent=0

结果:不加WHERE zone_parent=0:

加WHERE zone_parent=0(只拿出省份):

整个运行也只需要100多毫米挺快的

至此已经完成区域条件构建只拿出自己所具有的区域

总结:做完感觉数据库设计的重要性。一个好的数据库设计能够使整个开发变得简单清晰,一个糟糕的数据设计完全有可能使得某个需求无法满足。

   oracle 递归查询(start with …… connect by prior ……)的灵活使用 以及 union (去重) 合并结果集

oracle 递归应用(挺复杂的)的更多相关文章

  1. Oracle 递归的写法(start with) 以及where条件作用域

    先转一个讲Oracle递归讲得非常透彻的文章: http://blog.csdn.net/weiwenhp/article/details/8218091 前言:嗯,这也是一个前人挖坑,后人来填的故事 ...

  2. oracle 递归和connect by【转】

    oracle递归查询(单表包含多级上下级关系) http://www.cnblogs.com/walk-the-Line/p/4882866.html -- 查找所有第一层(包括)下的所有子节点 -- ...

  3. oracle递归层级查询 start with connect by prior

    递归层级查询:start with connect by prior  以部门表作为解析 表结构:dept{id:'主键',name:'部门名称',parent_id:'父亲id'} select * ...

  4. Oracle 递归

      当对象存在父节点.子节点时,通过特定的方式获取父节点.子节点数据构建树状结构或其它形式结构时,通常都会使用递归,如:一个公司有多个部门.每个部门下可能有多个小部门,小部门下面又有组-.为了数据容易 ...

  5. Oracle递归sql笔记

    查询一个机构下所辖机构: select * from t00_organ t start with t.organkey=#uporgankey# connect by prior t.organke ...

  6. Oracle递归 start with...connect by...prior

    prior一侧是父节点 另一侧是子节点 --查询region_id等于4519的节点下面的所有子节点 查找出给定节点的所有子节点 SELECT sr.* FROM spc_region sr wher ...

  7. Oracle递归操作

    需求:找出代理商中没有挂商家的代理商 简单SQL如下: select * from t_proxy tp where tp.id not in (SELECT tp.id as p_id FROM t ...

  8. [oracle] 递归追溯完整部门名称 函数

    create or replace function fn_DeptWholeName2(objectid in number) return nvarchar2 is wholename nvarc ...

  9. oracle 分页(rownum的理解) 以及 树节点的查询

    1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...

随机推荐

  1. 【leetcode❤python】 278. First Bad Version

    #-*- coding: UTF-8 -*-# The isBadVersion API is already defined for you.# @param version, an integer ...

  2. JAVA窗口程序实例一

    package 甲; import java.awt.Dimension; import java.text.SimpleDateFormat; import java.util.Calendar; ...

  3. 简述jpg。Gif。png-8.png-24的区别,分别使用场景

    gif.jpg.png格式的图片在网站制作中的区别 一.Gif格式特点: 1.透明性,Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha透明). 2.动画,G ...

  4. JS中函数声明与函数表达式的不同

    Js中的函数声明是指下面的形式: function functionName(){   } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如 var functionName ...

  5. [记录][python]python爬虫,下载某图片网站的所有图集

    随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...

  6. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法

    来源:http://ajxfxb.blog.163.com/blog/static/56675086201411634336878/ 作者是:没完没了的工作 asp.net报错“尝试读取或写入受保护的 ...

  7. Rdlc报表 数据汇总分组展示

    1.从工具箱拉出表或者矩阵(本次使用的是矩阵) 2.选择需要的数据集,没有就新建一个数据集,名称自己起好,下面有用到 3.将行组和行列显示出来(右击报表--试图=>) 4.双击行组下的RowGr ...

  8. SQL基础--索引

    索引的概念: 在数据库中索引是用于提升数据库查询操作性能的一种手段,但在频繁更新的表上,索引反而会降低性能. 常用的索引结构: B*树索引 位图索引 B树索引: B书索引是最基本的索引结构,Oracl ...

  9. 多个div同时居中的写法

    多个div在某个div的中间,他们个数不一定但是需要在那个父级div中显示(和margin:0 auto一样的效果) <!DOCTYPE html><html lang=" ...

  10. dos2unix 命令

    最近在学习shell编程,可是在<Linux程序设计>指定的网站上下载了源码,使用的时候却一直出问题.提示:"bash: ./here1:/bin/sh^M:损坏的解释器: 没有 ...