當前位置:首頁 » 編程語言 » sql求根節點
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql求根節點

發布時間: 2022-10-30 18:11:15

sql通過父節點獲取所有子節點

這個很簡單啊
表結構一般如下tablename(表名)
id--節點ID, name-- 節點名稱 parentid父節點ID,

-----獲取節點號為6下的所有子節點
select * from tablename t start with id =6 connect by prior id=parentid

Ⅱ 求高手幫忙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中,我現在有300條數據。其中00001是最大的根節點。有3個欄位id,pid,link.link是要求列出所以的節點

很高興為你解答, 這個需要用遞歸, 假設00001是id欄位, 表名是table, 想取得所有00001的數據

with ASSOCIATECTE
as(
select id, link from table where id='00001'
union all
select id, link from table tt inner join ASSOCIATECTE ee where ee.link = tt.id
)
select * from ASSOCIATECTE

試試這個, 希望能有幫助

Ⅳ SQL遞歸查詢所有子節點

你這樣設計的表用遞歸來顯示最恰當 我剛剛好有這個的代碼 發給你參考下吧
/// <summary>
/// 綁定根節點
/// </summary>
/// <param name="id"></param>
/// <param name="ddlList"></param>
public void BindSysMenu(string id, DropDownList ddlList)
{
ListItem ll = new ListItem();
ll.Text = "╋--請選擇-----";
ll.Value = "-1";
ddlList.Items.Add(ll);
DataTable dt = new ManageContentInfoBll().GetWName(id).Tables[0];
foreach (DataRow dr in dt.Rows)
{
ListItem li = new ListItem();
li.Text = "╋" + dr["W_Name"].ToString();
li.Value = dr["W_ID"].ToString();
ddlList.Items.Add(li);
BindSysMenuChild((dr["W_ID"].ToString()), ddlList, "├—");
}
}

/// <summary>
/// 綁定子節點
/// </summary>
public void BindSysMenuChild(string id, DropDownList ddlList, String separtor)
{
DataTable dt = new ManageContentInfoBll().GetWName(id).Tables[0];
foreach (DataRow dr in dt.Rows)
{
ListItem li = new ListItem();
li.Text = separtor + dr["W_Name"].ToString();
li.Value = dr["W_ID"].ToString();
string separtor_ = separtor + "——";
ddlList.Items.Add(li);
BindSysMenuChild(dr["W_ID"].ToString(), ddlList, separtor_);
}

}
sql 語句 很簡單的
select * from WebSubjectMenu where W_Logo ="+id+"
W_Logo 是上級的ID
希望對你有幫助吧。

Ⅳ SQL同時查詢當前節點、父節點、根節點的值

SELECTt1.name,t1.VALUE,t2.VALUEASparentvalue,(SELECTCASEWHENISNULL(parentid,'')=''THENa.VALUEEND
FROMbLEFTJOINdbo.aONa.orgid=b.orgid
WHEREISNULL(parentid,'')='')ASRootValue
FROMbLEFTJOINat1ONt1.orgid=b.orgid
LEFTJOINat2ONt2.orgid=b.parentid
WHEREb.orgid='001'

這個只是簡單的按你給的數據寫的,實際中可能存在問題,,,,

Ⅵ SQL (根據子節點查詢父節點信息)

declare @lt table(id int,level int)
declare @level int
declare @findid int
--初始化數據
set @findid = 25/*找nodeId = 25*/
--end of 初始化數據

set @level = 1
insert @lt select @findid,@level
while @@rowcount > 0
begin
set @level = @level + 1
insert @lt select a. parentId,@level
from 你的表名 a, @lt b
where a.nodeId = b.nodeId and b.level = @level - 1
end
--連接得到結果
select a.*
from 你的表名 a inner join @lt b
on a.nodeId=b.nodeId

Ⅶ sql查出一棵樹中的所有葉子節點,或者所有的雙親節點,該怎麼處理

sql查出一棵樹中的所有葉子節點,或者所有的雙親節點如題。
------解決方案--------------------------------------------------------
SELECT LPAD( ' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/ ') Path
FROM hr.employees
START WITH last_name = 'Kochhar '
CONNECT BY PRIOR employee_id = manager_id
ORDER SIBLINGS BY last_name結果為Path----------------------------------------/Kochhar/Kochhar/Baer
/Kochhar/Greenberg
/Kochhar/Greenberg/Chen
/Kochhar/Greenberg/Faviet
/Kochhar/Greenberg/Popp
/Kochhar/Greenberg/Sciarra
/Kochhar/Greenberg/Urman
/Kochhar/Higgins
/Kochhar/Higgins/Gietz
/Kochhar/Mavris
/Kochhar/Whalen
已選擇12行。
解釋:START WITH:指定root
CONNECT BY:指定父子關系
PRIOR:指定誰具有父親row的資格。此例中,表示如果row1.employee_id=row2.manager_id,則row1是row2的父親row
level: 表示等級了。
SIBLINGS:表示在相同level中排序。
SYS_CONNECT_BY_PATH( , ):x是column,c是字元。返回x的path,用c作為分界符,從root到本節點。

Ⅷ SQL SERVER 索引的工作原理

SQL 當一個新表被創建之時,系統將在磁碟中分配一段以8K為單位的連續空間,當欄位的值從內存寫入磁碟時,就在這一既定空間隨機保存,當一個8K用完的時候, SQLS指針會自動分配一個8K的空間。這里,每個8K空間被稱為一個數據頁(Page),又名頁面或數據頁面,並分配從0-7的頁號,每個文件的第0頁記錄引導信息,叫文件頭(File header);每8個數據頁(64K)的組合形成擴展區(Extent),稱為擴展。全部數據頁的組合形成堆(Heap)。
SQLS 規定行不能跨越數據頁,所以,每行記錄的最大數據量只能為8K。這就是char和varchar這兩種字元串類型容量要限制在8K以內的原因,存儲超過 8K的數據應使用text類型,實際上,text類型的欄位值不能直接錄入和保存,它只是存儲一個指針,指向由若干8K的文本數據頁所組成的擴展區,真正的數據正是放在這些數據頁中。
頁面有空間頁面和數據頁面之分。當一個擴展區的8個數據頁中既包含了空間頁面又包括了數據或索引頁面時,稱為混合擴展(Mixed Extent),每張表都以混合擴展開始;反之,稱為一致擴展專門保存數據及索引信息。表被創建之時,SQLS在混合擴展中為其分配至少一個數據頁面,隨著數據量的增長,SQLS可即時在混合擴展中分配出7個頁面,當數據超過8個頁面時,則從一致擴展中分配數據頁面。
空間頁面專門負責數據空間的分配和管理,包括:PFS頁面(Page free space):記錄一個頁面是否已分配、位於混合擴展還是一致擴展以及頁面上還有多少可用空間等信息;GAM頁面(Global allocation map)和SGAM頁面(Secodary global allocation map):用來記錄空閑的擴展或含有空閑頁面的混合擴展的位置。SQLS綜合利用這三種類型的頁面文件
在必要時為數據表創建新空間;數據頁或索引頁則專門保存數據及索引信息,SQLS使用4種類型的數據頁面來管理表或索引:它們是IAM頁、數據頁、文本/圖像頁和索引頁。
在WINDOWS 中,我們對文件執行的每一步操作,在磁碟上的物理位置只有系統(system)才知道;SQL SERVER沿襲了這種工作方式,在插入數據的過程中,不但每個欄位值在數據頁面中的保存位置是隨機的,而且每個數據頁面在「堆」中的排列位置也只有系統(system)才知道。這是為什麼呢?眾所周知,OS 之所以能管理DISK,是因為在系統啟動時首先載入了文件分配表:FAT(File Allocation Table),正是由它管理文件系統並記錄對文件的一切操作,系統才得以正常運行;同理,作為管理系統級的SQL
SERVER,也有這樣一張類似FAT的表存在,它就是索引分布映像頁:IAM(Index Allocation Map)。
IAM的存在,使SQLS對數據表的物理管理有了可能。
IAM 頁從混合擴展中分配,記錄了8個初始頁面的位置和該擴展區的位置,每個IAM頁面能管理512,000個數據頁面,如
果數據量太大,SQLS也可以增加更多的IAM頁,可以位於文件的任何位置。第一個IAM頁被稱為FirstIAM,其中記錄了以
後的IAM頁的位置。
數據頁和文本/圖像頁互反,前者保存非文本/圖像類型的數據,因為它們都不超過8K的容量,後者則只保存超過8K容
量的文本或圖像類型數據。而索引頁顧名思義,保存的是與索引結構相關的數據信息。了解頁面的問題有助我們下
一步准確理解SQLS維護索引的方式,如頁拆分、填充因子等。

二、索引的基本概念
什麼是索引呢?索引是一種特殊類型的資料庫對象,它與表有著密切的聯系。
索引是為檢索而存在的。如一些書籍的末尾就專門附有索引,指明了某個關鍵字在正文中的出現的頁碼位置,方便我們查找,但大多數的書籍只有目錄,目錄不是索引,只是書中內容的排序,並不提供真正的檢索功能。可見建立索引要單獨佔用空間;索引也並不是必須要建立的,它們只是為更好、更快的檢索和定位關鍵字而存在。
再進一步說,我們要在圖書館中查閱圖書,該怎麼辦呢?圖書館的前台有很多叫做索引卡片櫃的小櫃子,裡面分了若乾的類別供我們檢索圖書,比如你可以用書名的筆畫順序或者拼音順序作為查找的依據,你還可以從作者名的筆畫順序或拼音順序去查詢想要的圖書,反正有許多檢索方式,但有一點很明白,書庫中的書並沒有按照這些卡片櫃中的順序排列——雖然理論上可以這樣做,事實上,所有圖書的脊背上都人工的粘貼了一個特定的編號①,它們是以這個順序在排列。索引卡片中並沒有指明這本書擺放在書庫中的第幾個書架的第幾本,僅僅指明了這個特定的編號。管理員則根據這一編號將請求的圖書返回到讀者手中。這是很形象的例子,以下的講解將會反復用到它。
SQLS 在安裝完成之後,安裝程序會自動創建master、model、tempdb等幾個特殊的系統資料庫,其中master是SQLS的
主資料庫,用於保存和管理其它系統資料庫、用戶資料庫以及SQLS的系統信息,它在SQLS中的地位與WINDOWS下的注冊表相當。
master中有一個名為sysindexes的系統表,專門管理索引。SQLS查詢數據表的操作都必須用到它,毫無疑義,它是本文主角之一。查看一張表的索引屬性,可以在查詢分析器中使用以下命令:select * from sysindexes where id=object_id(『tablename』);而要查看錶的索引所佔空間的大小,可以使用系統存儲過程命令:sp_spaceused tablename,其中參數tablename為被索引的表名。

三、平衡樹
如果你通過書後的索引知道了一個關鍵字所在的頁碼,你有可能通過隨機的翻尋,最終到達正確的頁碼。但更科學更快捷的方法是:首先把書翻到大概二分之一的位置,如果要找的頁碼比該頁的頁碼小,就把書向前翻到四分之一處,否則,就把書向後翻到四分之三的地方,依此類推,把書頁續分成更小的部分,直至正確的頁碼。這叫「兩分法」,微軟在官方教程MOC里另有一種說法:叫B樹(B-Tree,Balance Tree),即平衡樹。
一個表索引由若干頁面組成,這些頁面構成了一個樹形結構。B 樹由「根」(root)開始,稱為根級節點,它通過指向另外兩個頁,把一個表的記錄從邏輯上分成兩個部分:「枝」—--非葉級節點(Non-Leaf Level);而非葉級節點又分別指向更小的部分:「葉」——葉級節點(Leaf Level)。根節點、非葉級節點和葉級節點都位於索引頁中,統稱為索引節點,屬於索引頁的范籌。這些「枝」、「葉」最終指向了具體的數據頁(Page)。在根級節點和葉級節點之間的葉又叫數據中間頁。
「根」(root)對應了sysindexes表的Root欄位,其中記載了非葉級節點的物理位置(即指針);非葉級節點位於根
節點和葉節點之間,記載了指向葉級節點的指針;而葉級節點則最終指向數據頁。這就是「平衡樹」。

四、聚集索引和非聚集索引
從形式上而言,索引分為聚集索引(Clustered Indexes)和非聚集索引(NonClustered Indexes)。
聚集索引相當於書籍脊背上那個特定的編號。如果對一張表建立了聚集索引,其索引頁中就包含著建立索引的列的值(下稱索引鍵值),那麼表中的記錄將按照該索引鍵值進行排序。比如,我們如果在「姓名」這一欄位上建立了聚集索引,則表中的記錄將按照姓名進行排列;如果建立了聚集索引的列是數值類型的,那麼記錄將按照該鍵值的數值大小來進行排列。
非聚集索引用於指定數據的邏輯順序,也就是說,表中的數據並沒有按照索引鍵值指定的順序排列,而仍然按照插入記錄時的順序存放。其索引頁中包含著索引鍵值和它所指向該行記錄在數據頁中的物理位置,叫做行定位符(RID:Row ID)。好似書後面的的索引表,索引表中的順序與實際的頁碼順序也是不一致的。而且一本書也許有多個索引。比如主題索引和作者索引。
SQL Server在默認的情況下建立的索引是非聚集索引,由於非聚集索引不對表中的數據進行重組,而只是存儲索引鍵
值並用一個指針指向數據所在的頁面。一個表如果沒有聚集索引時,理論上可以建立249個非聚集索引。每個非聚集索引提供訪問數據的不同排序順序。

Ⅸ delphi dxdbtreeview 裡面我想自己設定一個根節點(全局),然後下面的子節點用SQL語句來查詢顯示 怎麼實現

將所有內容跟1-2-3都設置上id、parentid,然後根據父ID找到根節點
如 : id parentid
a 1 0
b 2 1
c 3 1
d 4 0
e 5 4

Ⅹ 在sqlserver中實現樹形結構中根、子節點數據的添加、修改

這個很好實現!就是添加和修改操作:
增加節點:首先要獲取(在修改頁面)或指定(在sql語句中)parentid的值,然後插入數據就可以啊!
修改節點:可以根據menuid,修改節點的menuName或者parentid或者是同時修改它們倆。

有問題請留言!