1. 程式人生 > >Oracle plsql遞迴統計所有節點下的子節點&內容個數——start with connect by prior用法

Oracle plsql遞迴統計所有節點下的子節點&內容個數——start with connect by prior用法

有些情況下,在存有層級關係的表中,id欄位值本身會包含層級關係,例如每兩位表示一級。

要想只統計某個或某幾個層級節點下子節點+內容個數,就需要使用類似like ‘01%’的過濾條件即可。

例如select count(1) from test_category t where t.cid like '01%' or t.cid like '02%‘;

但是,如果id值本身無法表示層級關係,那麼必須使用如下方法,即使是隻統計某個或某幾個層級節點下子節點+內容個數。

/**遞迴查詢

已知,
節點下可以掛子節點或者內容,
葉子節點下只能掛內容,
內容下不能掛節點。

要統計每個節點下的內容個數(包括自己的內容和子節點的內容)
*/

----測試資料
--節點表
create table test_category(
cid varchar2(20), 
parentid varchar2(20)
);

--內容記錄表
create table test_category2content(
cateid varchar2(20),
contid varchar2(20),
record_date varchar(8)
);

--分支1
insert into test_category values('1', '0');
insert into test_category values('11', '1');
insert into test_category values('12', '1');----葉子節點
insert into test_category values('111', '11');----葉子節點
insert into test_category values('112', '11');

insert into test_category2content values('1', 'X', '20170606');
insert into test_category2content values('1', 'X', '20170607');
insert into test_category2content values('11', 'X', '20170606');
insert into test_category2content values('11', 'X', '20170607');
insert into test_category2content values('12', 'X', '20170606');
insert into test_category2content values('12', 'X', '20170607');
insert into test_category2content values('111', 'X', '20170606');
insert into test_category2content values('111', 'X', '20170607');
insert into test_category2content values('111', 'X', '20170608');

---分支2
--insert into test_category2content values('2', 'X', '20170606');
--insert into test_category2content values('21', 'X', '20170607');
--insert into test_category values('2', '0');
--insert into test_category values('21', '2');
--insert into test_category values('211', '21');----設為葉子節點
commit;

---結果:
--1:9
--11:5
--12:2
--111:3
--112:0
----正確的做法
select x.cid
  , (
    select sum(nvl(t2.amount, 0))--t1.cid, nvl(t2.amount, 0) as amount
 from test_category t1 left join
         (select cateid, count(1) as amount from test_category2content group by cateid) t2
        on t1.cid = t2.cateid
    start with t1.cid = x.cid
    connect by prior t1.cid = t1.parentid
  ) as cc 
from test_category x
;

---如果要統計給定日期(例如20170606)的各個節點下的子節點個數,就需要加上where語句
(下面這段語句是根據我專案中使用到的sql語句進行改寫的,沒有調測過)
select x.cid
  , '20170606' as datet
  , (
    select sum(nvl(t2.amount, 0))--t1.cid, nvl(t2.amount, 0) as amount
    from test_category t1 left join 
        (select cateid
                 , record_date as datet
                 , count(1) as amount from test_category2content group by cateid, record_date) t2
        on t1.cid = t2.cateid
    where t2.datet = '20170606'-----added 
    start with t1.cid = x.cid
    connect by prior t1.cid = t1.parentid
  ) as cc
from test_category x
;


----//====稍微研究下connect by的作用
---從parentid到cid開始遞迴,並以parentid為主展示這條記錄
select t1.parentid, t1.cid, level
from test_category t1
start with t1.parentid = 1
connect by prior t1.parentid = t1.cid
;
---從parentid到cid開始遞迴,並以parentid為主展示這條記錄
select t1.parentid, t1.cid, level
from test_category t1
start with t1.cid = 1
connect by prior t1.parentid = t1.cid
;

---從parentid到cid開始遞迴,並以cid為主展示這條記錄
select t1.cid, t1.parentid, level
from test_category t1
start with t1.parentid = 1
connect by t1.parentid = prior t1.cid
;
---從parentid到cid開始遞迴,並以cid為主展示這條記錄
select t1.cid, t1.parentid, level
from test_category t1
start with t1.cid = 1
connect by t1.parentid = prior t1.cid
;

相關推薦

Oracle plsql統計所有節點下的子節點&內容個數——start with connect by prior用法

有些情況下,在存有層級關係的表中,id欄位值本身會包含層級關係,例如每兩位表示一級。 要想只統計某個或某幾個層級節點下子節點+內容個數,就需要使用類似like ‘01%’的過濾條件即可。 例如select count(1) from test_category t wh

oraclestart with .. connect by prior.. 用法簡介

bsp 簡單 parent 目錄樹 lena prior conn 就是 比較 我們經常會將一個比較復雜的目錄樹存儲到一個表中。或者將一些部門存儲到一個表中,而這些部門互相有隸屬關系。這個時候你就會用到connect by prior start with。oracle 提

Oracle樹查詢,start with connect by prior 查詢用法(轉載)

本人覺得這個寫的真不錯,實用性強,就轉載過來了 這個子句主要是用於B樹結構型別的資料遞迴查詢,給出B樹結構型別中的任意一個結點,遍歷其最終父結點或者子結點。 先看原始資料: 1 create table a_test 2 ( parentid varchar2(10), 3

Oracle 樹操作、查詢(select…start withconnect byprior)

一、Oracle中start with…connect by prior子句用法 connect by 是結構化查詢中用到的,其基本語法是: select … from tablename start with 條件1connect by 條件2where 條件3; 例: select

Oraclestart with connect by prior 查詢

這個子句主要是用於B樹結構型別的資料遞迴查詢,給出B樹結構型別中的任意一個結點,遍歷其最終父結點或者子結點。 建立測試表: create table a_test ( parentid varchar2(10), subid varchar2(10)); in

Oracle查詢start with connect by prior

一、基本語法 connect by遞迴查詢基本語法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以什麼為根節點,不加限制可以寫1=1,要以id為123的節點為根節點,就寫為start with id

mysql的逆襲:如何做oraclestart with connect by prior層次查詢

mysql的逆襲:如何做遞迴層次查詢   最近在做一個從oracle資料庫到mysql資料庫的移植,遇到一個這樣的問題        在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY

oracle中用start with...connect by prior子句實現查詢[例子不錯]

  今天在做許可權這一塊,碰到要讀取oracle中的樹形結構,所以就用到了start with...connect by prior。所以留個腳印以後碰到可以看看。   在oracle中的select語句可以用start with...connect by prior

Oracle start with connect by prior... 歸查詢

span into mage create level 結構 最終 1-1 pre start with connect by prior 主要是用於B樹結構類型的數據遞歸查詢,給出B樹結構類型中的任意一個節點,遍歷其最終父節點或者子節點。 -- create table

Oracle 歸查詢 (start with ...connect by ...prior

父親 select 進行 根節點 con ble 檢索 記錄 where 1、connect by 是結構化查詢中用到的,其基本語法是:select … from tablename start with 條件1connect by 條件2where 條件3;例:selec

Oracle高級函數篇之歸查詢start with connect by prior簡單用法

上一條 prior 結果 表結構 from oracl 結構 ... 可能 路飛:“ 把原來CSDN的博客轉移到博客園咯!” 前段時間,自己負責的任務中剛好涉及到了組織關系的業務需求,自己用了oracle遞歸查詢。下面簡單來舉個例子。在工作中我們經常會遇到有一定組織關系層次

start with connect by prior 查詢用法

這個子句主要是用於B樹結構型別的資料遞迴查詢,給出B樹結構型別中的任意一個結點,遍歷其最終父結點或者子結點。 先看原始資料: create table a_test ( parentid varchar2(10),   subid    varchar2(10)); i

oraclestart with connect by prior 學習

哪些 num 例子 value 開始 一個 分享 語法 節點 語法: SELECT ... FROM + 表名 START WITH + 條件1 CONNECT BY PRIOR + 條件2 WHERE + 條件3

start with connect by prior 歸查詢用法

nec 示例 pos tab mage log int border 在一起 這個子句主要是用於B樹結構類型的數據遞歸查詢,給出B樹結構類型中的任意一個結點,遍歷其最終父結點或者子結點。 先看原始數據: 1 create table a_test 2 ( paren

Oracle 樹操作(select…start withconnect byprior)

ber 的確 pri RM ade 第一個 項目 兄弟節點 類型 oracle樹查詢的最重要的就是select…start with…connect by…prior語法了。依托於該語法,我們可以將一個表形結構的以樹的順序列出來。在下面列述了oracle中樹型查詢的常用查

oraclestart with connect by prior如何使用

SQ font 過濾 圖片 acl http nec con IT oracle的start with connect by prior是根據條件遞歸查詢"樹",分為四種使用情況: 第一種:start with 子節點ID=‘...‘ connect by prior 子節

oracle樹查詢start with connect by prior 以及level 的使用

在oracle中, level是和connect by ,start with 結合在一起使用的. 用於遞迴查詢. connect by 子句用於定義表中的資料是如何聯絡的 start with子句用於定義樹查詢的初始的起點 level表示查詢的深度(level 表示遞迴的層次) 表

oraclestart with connect by prior用法

1.   select sys_connect_by_path(t.dept_id,'/') from syc_smg_dpt t start with t.dept_id='RT_DISTRICT_JN_01' connect by prior dept_id = par

mysql 查詢所有的子節點

<select id="findDto" resultMap="EmployeeDtoMap" parameterType="e="java.lang.Integer" >" > select * from ( select a.*, *, b.name as as department_

oracle查詢start with ... connect by 的使用

create table test_wx (id varchar2(30), pid varchar2(30), type varchar2(30) ); insert into test_wx (ID, PID, TYPE) values ('10', '0', 'A'