如何實現Oracle環境下樹形結構的跨行相乘

2021-10-10 22:55:08 字數 1330 閱讀 7787

我們都知道,對數相加具有以下性質:

ln(2)+ln(5)= ln(2*5) = ln(10)

因此只需要對需要相乘的引數,取對數求和後,再使用指數函式,就可以求得相乘的結果。而sql的sum()聚合函式支援求和,exp()支援求指數,那就實現了跨行相乘。

--構建例項實現跨行相乘例項2*5         

create

table t1 (num number)

;insert

into t1 values(2);

insert

into t1 values(5);

select num from t1;

select exp(

sum(ln(num)))

from t1;

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-qtl3bzpb-1606552335176)(

使用關聯子查詢,構建兩層查詢。

外層查詢從根節點開始,自上而下,構建出整個樹的形狀。

內層查詢自下而上,構建出當前節點到根節點的結果集。對結果集進行跨行相乘,得到該節點乘積。

select

level

, o.id

, o.yield,(

select

round

( exp(

sum(ln(i.yield)))

,2)-- 對相乘結果保留四捨五入保留兩位

from

hierarchy_example i

start

with

i.id = o.id -- 使用關聯子查詢,將外層查詢的id代入內層查詢

connect

by nocycle

i.id = prior i.prior_id -- 使用外層查詢的id,自下而上遍歷整棵樹

)as yield_to_step

, connect_by_root( o.id )

as root_id

, sys_connect_by_path( o.id,

'/')

as path

from

hierarchy_example o

start

with

o.prior_id is

null

-- 外層查詢,從根結點開始

connect

by nocycle

o.prior_id = prior o.id -- 外層查詢自上而下。

order siblings by

o.id;

Oracle表中實現遞迴查詢樹形結構

若將乙個樹狀結構儲存在一張表裡,需要在表中存入兩個欄位id和parentid,表示每一條記錄的parent是誰。table treetable idparentid 欄位3 1nulla 21b 32d oracle中可以使用 select from start with 開始的節點 connect...

oracle如何實現lastindexof的功能

第一種實現方法 reverse substr reverse str 1,instr reverse str 1 利用reverse函式,該函式的功能是反轉倒置。但是據測試在儲存過程中不能使用。於是到網上找了另外一種實現方法。第二種 substr str,instr str,1,1 1,length...

Oracle 中實現查詢樹形結構節點功能

這個方法只是對oracle10以上才有效,對sqlserver mysql沒有測試 select connect by isleaf isleaf,tb.switch type id,sys connect by path tb.package id,path,tb.record type,tb.e...