当前位置:首页 » 编程语言 » 查询树节点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
/*--结果
|--山东埋升省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/