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

查詢樹節點sql

發布時間: 2023-05-31 17:40:09

sqlserver查詢樹形結構的所有子節點

用標准sql的with實現遞歸查詢(sql2005以上肯定支持,sql2000不清楚是否支持):

with subqry(id,name,pid) as (
select id,name,pid from test1 where id = 5
union all
select test1.id,test1.name,test1.pid from test1,subqry
where test1.pid = subqry.id
)
select * from subqry;

② 如何用SQL解決樹查詢問題,急!!!

oracle中的select語句可以用START WITH...CONNECT BY PRIOR子句實現遞歸查詢,connect by 是結構化查詢中用到的,其基本語法是:

select * from tablename start with cond1
connect by prior cond2
where cond3;

簡單說來是將一個樹狀結構存儲在一張表裡,比如一個表中存在兩個欄位:
id,parentid。那麼通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。

用上述語法的查詢可以取得這棵樹的所有記錄。

其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。

COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。

COND3是過濾條件,用於對返回的所有記錄進行過濾。

③ 求高手幫忙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語句 求大神來,如果獲取樹的根節點(蘋果和捲心菜)的所有欄位

---建個表
createtabletest
(resourceidvarchar(32),
levelclassidvarchar(32),
namevarchar(32))
insertintotest
select'INDEX','','根'
unionselect'fruit','INDEX','水果'
unionselect'vegetable','INDEX','蔬菜'
unionselect物襪'apple','fruit','蘋果'
unionselect'cabbage','vegetable','捲心菜'閉螞坦
select*fromtest
selectdistinctname[根節點]fromtest--查轎桐詢根節點
whereresourceidnotin()

⑤ 一個樹結構的表查找沒有子節點的節點,如何寫SQL

select id from table where parentid not in(select id from table )

⑥ SQL里樹狀結構的表,找樹葉節點。

找樹葉簡單啊

SELECT
*
FROM
表 main
WHERE
NOT EXISTS (
SELECT * FROM 表 sub WHERE main.ID = sub.ParentID
)

也就是對於 表的 每一行, 不存在有其他行的數據, ParentID 等於 當前行的 ID

⑦ 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行。

⑧ 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查詢出樹狀結果

SQL code
就是類似這個撒
--測試數據
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山東省'
UNION ALL SELECT '002','001','煙台市'
UNION ALL SELECT '004','002','招遠市'
UNION ALL SELECT '003','001','青島市'
UNION ALL SELECT '005',NULL ,'四會市'
UNION ALL SELECT '006','005','清遠市'
UNION ALL SELECT '007','006','小分市'
--深度排序顯示處理
--生成每個察蔽節點的敗液州編碼累計(相同當單編號法的編碼)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
--顯示結果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--結果
|--山東埋升省
|--煙台市
|--招遠市
|--青島市
|--四會市
|--清遠市
|--小分市
--*/