這個(gè)估計(jì)PKId是ParentId的父節(jié)點(diǎn)吧
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供通道企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為通道眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
給你舉個(gè)例子,就只用這兩個(gè)字段吧,其他的也沒(méi)多大用
PKId ParentId
1 0
2 0
3 1
4 2
5 1
假設(shè)數(shù)據(jù)是我上邊這樣的
可以假設(shè)每個(gè)PKId分別為商品大類,就把1的定義為軟件吧,2定義為硬件,3為硬盤(pán),4為ps軟件,5為主板
這樣的話,你就能看出對(duì)應(yīng)關(guān)系了吧?
1和2是最高層的,所以無(wú)父節(jié)點(diǎn),所以ParentId為0
3和5都是硬件,所以歸屬為1
4為軟件,所以歸屬為2
這樣的好處是減少多次讀取其他表里的無(wú)用信息,在一定程度上可以提高效率,當(dāng)然是指數(shù)據(jù)量大的時(shí)候,數(shù)據(jù)量小的時(shí)候基本沒(méi)什么區(qū)別
作用你自己都說(shuō)了,其實(shí)就是實(shí)現(xiàn)自我關(guān)聯(lián)
但是這樣有一點(diǎn)不好,在自身有主鍵外鍵,如果其中的邏輯關(guān)系弄的不太清楚的話,很容易出問(wèn)題,簡(jiǎn)單來(lái)說(shuō)就是這樣了
1.創(chuàng)建測(cè)試表,createtabletest_connect(idnumber,p_idnumber);
2.插入測(cè)試數(shù)據(jù),
Insertintotest_connectvalues(1,1);
Insertintotest_connectvalues(2,1);
Insertintotest_connectvalues(3,2);
Insertintotest_connectvalues(4,3);
提交;
3.查詢數(shù)據(jù)表的內(nèi)容,選擇*fromtest_connect,
4.執(zhí)行遞歸查詢語(yǔ)句,將答案添加到nocycle元素中,就不會(huì)有[ora-01436:CONNECTBYerrorintheuserdata]。執(zhí)行結(jié)果如下:
Select*
來(lái)自test_connectt
從id=4開(kāi)始
由nocyclepriort連接。p_id=t.i.
select * from table_name where id in (select id from table connect by prior id = pid start with id = 你想起始的ID);
(select id from table connect by prior id = pid start with id = 你想起始的ID);
這部分就可以遞歸查詢到所有以某一個(gè)父ID下的所有的包含父ID在內(nèi)的所有ID!
sql 遞歸查詢的方法:
方法一:T-SQL遞歸查詢
with Dep as
(
select Id,DeptCode,DeptName from Department where Id=1
union all
select d.Id,d.DeptCode,d.DeptName from Dep
inner join Department d on dep.Id = d.ParentDeptId
)
select * from Dep
方法二:PL/SQL遞歸查詢
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;
我來(lái)測(cè)一下,等會(huì)上傳結(jié)果
你還有一個(gè)表沒(méi)用到。
WITH cte AS (
SELECT RegionID,RegionName,RegionPID FROM [tbRegionTree] WHERE regionPID='01'
UNION ALL
SELECT d.RegionID,d.RegionName,d.RegionPID FROM cte c inner JOIN [tbRegionTree] d ON d.regionPID=c.RegionID
)
SELECT * FROM cte
上面是找到 01 中國(guó)的。
下面為非中國(guó)的。 條件上處理下
WITH cte AS (
SELECT RegionID,RegionName,RegionPID FROM [tbRegionTree] WHERE regionPID NOT LIKE '01%'
UNION ALL
SELECT d.RegionID,d.RegionName,d.RegionPID FROM cte c inner JOIN [tbRegionTree] d ON d.regionPID=c.RegionID
)
SELECT * FROM cte