當前位置:首頁 » 編程語言 » sqlwith遞歸

sqlwith遞歸

發布時間: 2023-07-06 22:12:41

⑴ 高手幫忙:sql 里怎樣遞歸判斷父節點和子節

-- 查找所有父節點
with tab as
(
select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316--子節點
union all
select b.Type_Id,b.ParentId,b.Type_Name
from
tab a,--子節點數據集
Sys_ParamType_V2_0 b --父節點數據集
where a.ParentId=b.Type_Id --子節點數據集.parendID=父節點數據集.ID
)
select * from tab;

-- 查找所有子節點
with tab as
(
select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=1--父節點
union all
select b.Type_Id,b.ParentId,b.Type_Name
from
tab a,--父節點數據集
Sys_ParamType_V2_0 b--子節點數據集
where b.ParentId=a.Type_Id --子節點數據集.ID=父節點數據集.parendID
)
select * from tab;

⑵ sql語句實現遞歸查詢所有節點,mysql和oracle都能用的

首先說一下Oracle的遞歸查詢,相信大部分人都知道很簡單。無非start with connect by 函數。下面是從pId向子節點遞歸查詢的例子,unId是資料庫表中的主鍵。

如果是從子節點遞歸到父節點查詢,就把start with 換成unid,prior左右對換

下面再講MySql 的遞歸查詢方式。MySql沒有Oracle的強大功能,雖然都是同一個公司的產品。所以只能靠自己寫。有很多方法,用sql去循環查詢,或者寫存儲過程,我這里只提供一種。就是新建一個function函數。

表結構不說了,無非就是 Id ,pId,其他列。下面是創建一個遞歸查詢子節點的函數

DROP FUNCTION IF EXISTS queryChildrenPowerInfo;

CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))

RETURNS VARCHAR(2000)

BEGIN

DECLARE sTemp VARCHAR(2000);

DECLARE sTempChd VARCHAR(2000);

SET sTemp = '$';

SET sTempChd = cast(powerId as CHAR);

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempChd);

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;

END WHILE;

return sTemp;

調用的時候:select queryChildrenPowerInfo(""); 該語句會返回Id和父Id等於傳入參數powerId的一個字元串,中間有逗號隔開如圖

下面這句代碼的意思是,查詢出 t_discretionary_power 表中,t.id 等於上面查詢出的結果集的數據。FIND_IN_SET(A,B)是MYSQL的函數。意思是查找在B集合中有A的數據。相當於In

select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo(''))

⑶ mysql 怎麼實現sql的with遞歸

概念說不一定理解,給你一個例子你自己參悟。 SELECT TEACHER FROM C AS X WHERE UNIQUE(SELECT TEACHER FROM C AS Y WHERE Y.TEACHER=X.TEACHER);

⑷ sql存儲過程用遞歸

表結構:
sale_area銷售分區表
PK#area_id
class_id
gonghao

prod_class產品分類表
PK#class_id
class_name

問題sql語句:
select distinct pa.class_id from prod_class As pa,prod_class As pb,sale_area where pb.class_id in(select sale_area.class_id from sale_area where sale_area.gonghao=<param>) and pa.class_id like pb.class_id||'%'

問題定義:
根據傳入的參數gonghao來確定對應的class_id集,然後遍歷這個class_id集,並「擴充」這個集合
要理解「擴充」必須知道class_id是這樣設等級:
0為最高級
|_01
| |_011
| |_012
|_02
|_011
|_012
那麼擁有等級0的話,所有的等級都應該可以訪問,擁有等級01的話,011、012也可以訪問。
這句sql的目的就是得到當前員工能訪問的所有產品分類及它的子集。

通過自連接的做法在Oracle里是對的,在DB2里就錯,原因在於DB2中謂詞like兩邊至少有一個是字元串,也就是說DB2不認為pb.class_id||'%'是字元串。

求解:
要完成上面的任務有什麼可替代的辦法或改進的地方,注意環境是DB2 UDB 7.2。
---------------------------------------------------------------

就是樹的問題。
使用公共表達式可以完成。
你在信息中心裏面按recusion去搜索,可以找到遞歸sql的寫法。
---------------------------------------------------------------

問題寫的很清楚,我喜歡!
如果要使用DB2的公共表達式建議你把
prod_class產品分類表結構改一下
PK#class_id
class_name
Parent_Class_id

sql語句如下:

with temp_class_id( class_id,class_name)
(
select pc.class_id,pc.class_name from prod_class pc
where pc.class_id in (select sale_area.class_id from sale_area
where sale_area.gonghao=<param>)
union
select pc.class_id,pc.class_name from prod_class pc,
temp_class_id tc
where pc.parent_id = tc.class_id)
select * from temp_class_id;

⑸ SQL資料庫實現遞歸查詢的幾種代碼方法

SQL 資料庫 實現遞歸查詢的幾種代碼方法 表結構

ProctCategory

CategoryID Level ParentCategoryID

數據

T SQL

WITH CategoryTemp(CategoryID ParentCategoryID) 臨時表用來保存查到的Category

(

SELECT CategoryID ParentCategoryID FROM ProctCategory WHERE ParentCategoryID<= 將所有的第一層查出來作為初始數據 需要查第幾層或者哪個ParentCategoryID下面所有的 N層 把ParentCategoryID賦相關的值即可

UNION ALL 查詢N層

SELECT pc CategoryID ParentCategoryID FROM ProctCategory pc

LEFT JOIN CategoryTemp ct ON pc ParentCategoryID=ct CategoryID

WHERE ParentCategoryID> 因為第一層前面已經查出來了 所以這里把第一層篩選掉

)

SELECT CategoryID ParentCategoryID FROM CategoryTemp

結果

裂鍵檔

如果把ParentCategoryID賦為 結果則為

實例

ID是否為部門 部門名 上級ID y 部門 y 部門 n 張三 n 李二 y 部門 n 王五 y 部門3亮賀 n 小三 我想找詢 ID 值為 下級的所有人員包括下級部門的所有人員

創建查詢函數 create function f_id( @id int 要查詢的id )returns @re table(id int level int) as begin declare @l int set @l= insert @re select id @l from 表 where 上級id=@id while @@rowcount> begin set @l=@l+ insert @re select a id @l from 表 a join @re b on a 上級id=b id and b level=@l end return end go

調用函數進行查詢 select a * from 表 a join f_id( ) b on a id=b id

聯合查詢

測試數據 create table 表(ID int 是否為部門 char( ) 部門名 varchar( ) 上級ID int) insert 表 select y 部門 union all select y 部門 union all肆亂 select n 張三 union all select n 李二 union all select y 部門 union all select n 王五 union all select y 部門 union all select n 小三 go

創建查詢函數 create function f_id( @id int 要查詢的id )returns @re table(id int level int) as begin declare @l int set @l= insert @re select id @l from 表 where 上級id=@id while @@rowcount> begin set @l=@l+ insert @re select a id @l from 表 a join @re b on a 上級id=b id and b level=@l end return end go

調用函數進行查詢 select a * from 表 a join f_id( ) b on a id=b id go

刪除測試 drop table 表 drop function f_id

/* 測試結果

ID 是否為部門 部門名 上級ID n 小三

lishixin/Article/program/MySQL/201311/29557

⑹ sql 怎麼遞歸查詢的方法:

1.創建測試表,createtabletest_connect(idnumber,p_idnumber);

熱點內容
怎麼打開電腦雲伺服器 發布:2025-02-09 08:36:01 瀏覽:219
日元對人民幣演算法 發布:2025-02-09 08:35:52 瀏覽:39
安卓手機微信語音怎麼不能轉文 發布:2025-02-09 08:25:30 瀏覽:922
c上機編程題 發布:2025-02-09 08:17:18 瀏覽:319
顯示語法錯誤編譯不出來 發布:2025-02-09 08:17:09 瀏覽:286
酒店配置什麼滅火系統 發布:2025-02-09 08:06:37 瀏覽:774
java至尊 發布:2025-02-09 08:03:23 瀏覽:559
pythonwith 發布:2025-02-09 08:00:25 瀏覽:173
Ftp打開文件是只讀模式 發布:2025-02-09 07:40:55 瀏覽:505
androidlistview點擊事件 發布:2025-02-09 07:25:52 瀏覽:173