當前位置:首頁 » 編程語言 » sql遞歸父節點

sql遞歸父節點

發布時間: 2022-12-06 07:14:04

❶ 高手幫忙: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(''))

❸ SQL遞歸(高分,急).

這個估計PKId是ParentId的父節點吧
給你舉個例子,就只用這兩個欄位吧,其他的也沒多大用
PKId ParentId
1 0
2 0
3 1
4 2
5 1

假設數據是我上邊這樣的
可以假設每個PKId分別為商品大類,就把1的定義為軟體吧,2定義為硬體,3為硬碟,4為ps軟體,5為主板

這樣的話,你就能看出對應關系了吧?
1和2是最高層的,所以無父節點,所以ParentId為0
3和5都是硬體,所以歸屬為1
4為軟體,所以歸屬為2
這樣的好處是減少多次讀取其他表裡的無用信息,在一定程度上可以提高效率,當然是指數據量大的時候,數據量小的時候基本沒什麼區別
作用你自己都說了,其實就是實現自我關聯

但是這樣有一點不好,在自身有主鍵外鍵,如果其中的邏輯關系弄的不太清楚的話,很容易出問題,簡單來說就是這樣了

❹ sql 知道父節點,查詢所有的子節點,運用游標,遞歸,存儲過程

呃,因為我不清楚你的表裡,這個BPROD
char(15)
老爸
裡面記錄的值是不是和BMWHS
對應的,所以只能說個大概。
select
sys_connect_by_path(username,'>')
"Path"
from
tmbm
start
with
id=1
connect
by
prior
id=parentid;
其中,id是你要遍歷的起始點,比如你想從
廠號=XX
的這個父節點開始尋找他所有的子節點,這里就換成
start
with
BMWHS=XX
然後,connect
by
prior
id=parentid,這里id=parentid,簡單解釋就是尋找其他記錄里,parentid和我的id相同的記錄,也就是找子節點。
應該是換成你的BMWHS=BPROD(我不知道你的BPROD
BCHLD
和哪個屬性是對應的,是BMWHS嗎?)
如果是的話就是下面這樣(username是你要返回的值,假設你還是要返回
BSEQ
序號)
select
sys_connect_by_path(BSEQ,'>')
"Path"
from
tmbm
start
with
BMWHS=XX
connect
by
prior
BMWHS=BPROD;

❺ SQL遞歸獲取所有父節點的函數

*************

函數如下,請根據你自己的實際情況,把漢字換成相應的具體信息

*************

CREATEFUNCTION函數名(@idASvarchar(2))RETURNSvarchar(1000)AS

BEGIN

[email protected](1000)

[email protected]

BEGIN

[email protected][email protected]+','+isnull(dbo.函數名(第三列欄位),'')FROM[表名]WHERE[第一列欄位][email protected]

[email protected]

***********

調用方法:

***********

SELECTsubstring(dbo.函數名('15'),1,len(dbo.函數名('15'))-1)

**********

給你個我測試的截圖,參考

**********

---

以上,希望對你有所幫助。

❻ 求高手幫忙sql寫法:樹節點放一個表中,怎麼用一條語句查詢一個節點及對應的所有父節點信息。

建議使用遞歸,
oracl語法示例如下、
CREATE TABLE TBL_TEST
(
ID NUMBER, --主鍵
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0 --------父節點主鍵
);
插入測試數據:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
從Root往樹末梢遞歸
select * from TBL_TEST
start with id=1
connect by prior id = pid
從末梢往樹ROOT遞歸
select * from TBL_TEST
start with id=5
connect by prior pid = id
SQL server 2005語法示例如下、
CREATE TABLE TBL_TEST
(
ID int,
NAME VARCHAR(100),
PID int DEFAULT 0
);

插入測試數據:

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

select * from TBL_TEST

--從Root往樹末梢遞歸

with cte as
(select *,0 as TLevel from TBL_TEST where ID=1
union all
select t1.*,t2.TLevel+1 from TBL_TEST t1 inner join cte t2 on t1.PID=t2.ID)
select * from cte

--從末梢往樹ROOT遞歸

with cte as
(select *,0 as TLevel from TBL_TEST where ID=5
union all
select t1.*,t2.TLevel+1 from TBL_TEST t1 inner join cte t2 on t1.ID=t2.PID)
select * from cte

❼ 遞歸SQL語句


CREATETABLE#test(
Achar(1),
Bchar(1)
)
GO

INSERTINTO#testVALUES('a','b');
INSERTINTO#testVALUES('b','c');
INSERTINTO#testVALUES('c','d');
INSERTINTO#testVALUES('d','e');
INSERTINTO#testVALUES('e','f');
INSERTINTO#testVALUES('a','g');
INSERTINTO#testVALUES('a','h');
INSERTINTO#testVALUES('g','m');
INSERTINTO#testVALUES('m','n');
GO


WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.A=t.B)
)
SELECTtop1
AAS[最高父節點]
FROM
myCTE
ORDERBY
LevelDESC
GO

最高父節點
-----
a

(1行受影響)

WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.B=t.A)
)
SELECTtop1
BAS[最下面子節點]
FROM
myCTE
ORDERBY
LevelDESC
GO


最下面子節點
------
f

(1行受影響)



SQL Server 2008 Express 版本下測試通過。

熱點內容
刷榜腳本 發布:2023-02-02 06:27:52 瀏覽:539
nm編程 發布:2023-02-02 06:24:49 瀏覽:920
學那些編程 發布:2023-02-02 06:24:40 瀏覽:531
sql2000sa密碼修改 發布:2023-02-02 06:19:30 瀏覽:736
apex為什麼一直啟動伺服器 發布:2023-02-02 06:14:13 瀏覽:577
石家莊漫咖啡無線密碼多少 發布:2023-02-02 06:12:37 瀏覽:298
對象存儲備份代碼 發布:2023-02-02 06:11:38 瀏覽:596
銀河戰艦怎麼存儲資源 發布:2023-02-02 06:10:52 瀏覽:875
水密碼護膚品適合什麼年齡段 發布:2023-02-02 06:08:58 瀏覽:241
汽車保險如何配置好 發布:2023-02-02 06:07:45 瀏覽:936