zoukankan      html  css  js  c++  java
  • 关系型数据库的树形结构查询(Oracle、Postgres)

    Oracle :
      start with… connect by 的用法。语法:select * from table [where 条件1] connect by[条件2] start with[条件3]。
      connect by 和 start with的位置并无先后顺序。 

    select * from sys_organ_info where organ_id not in(4,6) start with organ_id = 3 connect by organ_id = prior organ_pid

      pid为父类。prior英文意思是在前的,居先的。所以,prior放在哪一边的话,表示哪一边为父类。故,这句sql是从树自下而上搜索。如果connect by的条件为 prior organ_id = organ_pid的话,可以理解成:之前那条数据的organ_id是当前这条数据的organ_pid, 就是从树自上而下钻取搜索,即:查询出organ_id的所有子类、孙类、重孙类等。
    PG:

    WITH RECURSIVE rcs as (
    SELECT a.* FROM share_dev_type a
    WHERE p_id = 1
    UNION ALL
    SELECT b.* FROM share_dev_type b, rcs
    WHERE b.p_id = rcs.id
    )
    SELECT * FROM rcs

      用递归的方式,把一个表分成两份a和b,  查p_id = 1 的所有数据,此句表示 a 中的p_id=1,递归的条件即是 b的p_id即是a的id。 故,查询的是p_id = 1 的子孙数据。结果如图:

    如果查父类:

        WITH RECURSIVE rcs as (
            SELECT a.* FROM share_dev_type a
            WHERE id = 126
            UNION ALL
            SELECT b.* FROM share_dev_type b, rcs
            WHERE b.id = rcs.p_id
        )
     SELECT * FROM rcs

    此句表示 a 中的id = 126,递归的条件即是 b的id即是a的p_id。 故,查询的是id = 126 的 父类数据。结果:

  • 相关阅读:
    1055. [HAOI2008]玩具取名【区间DP】
    BZOJ2435:[NOI2011]道路修建 (差分)
    1084. [SCOI2005]最大子矩阵【网格DP】
    1060. [ZJOI2007]时态同步【树形DP】
    1050. [HAOI2006]旅行【并查集+枚举】
    2463. [中山市选2009]谁能赢呢?【博弈论】
    luogu P1195 口袋的天空
    luogu P1162 填涂颜色
    luogu P1223 排队接水
    luogu P1331 海战
  • 原文地址:https://www.cnblogs.com/lioa/p/12072833.html
Copyright © 2011-2022 走看看