with partents as (
select * from T_DPT where CID in('123')
UNION ALL
(
SELECT a.* from T_DPT a
inner join partents as b on a.CID=b.DPT_SUP_CID
)
)
SELECT CID FROM partents where DPT_SUP_CID not in ('123')
2020-05-28 补充修改
--根据指定子节点获取所有父节点--
WITH TEMP AS
(
SELECT * FROM T_DPT WHERE DPT_NAME ='BU9.7.1O10908831' --子级
UNION ALL
SELECT T0.* FROM TEMP,T_DPT T0 WHERE TEMP.dpt_sup_cid=T0.cid --父级ID==子级ID
)
SELECT * FROM TEMP;
--根据指定节点ID获取所有子节点--
WITH TEMP AS
(
SELECT * FROM T_DPT WHERE DPT_NAME ='南方中心O10907566' --父级
UNION ALL
SELECT T0.* FROM TEMP,T_DPT T0 WHERE TEMP.cid=T0.dpt_sup_cid --子级ID==父级ID
)
SELECT * FROM TEMP;
在最近老是用到这个
SQL
,所以记下来了:
1:创建表
CREATE TABLE [dbo].[BD_Booklet]( [ObjID] [int] IDENTITY(1,1) NOT NULL, [ParentID] [int] NULL, [ObjLen] [int] NULL, [ObjName] [nvarchar](50) NULL, [ObjUrl] [nvarchar](...
where ObjectId = 2
union all
select d.ObjectId,d.Pid,d.Name,lvl + 1 from children c inner join SysStruct d
on c.ObjectId = d.
在
SQL
Server 中,使用 CTE 表达式很容易做到无限层次父子关系
查询
;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
在 My
SQL
中,这个需求的实例稍显复杂, My
SQL
中没有支持递归的
查询
,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归
查询
,想法独特,分享一下。
表结构和数据
CREATE TABLE table1(id int, name varchar(10), parent_id int);
INSERT table
此
sql
查询
id=2的所有
子节点
id,并包括当前id=2的
节点
,如果不想包括当前
节点
,去掉。此
sql
查询
id=3的所有
父节点
sql
,parent_id:父id。
with tab as
select pc.id,pc.ParentId,pcd.Name,1 as [level] from ProductCategories pc join Produ...
SQL
Server 2005开始支持递归
查询
了。之前我们在保存一个树状结构的时候,常常采用在表格中增加一个ParentID这个字段保存其对应上级,但是这样的表格设计,在
查询
的时候,需要多次
查询
才能
查询
出
所需要的结果,一般都需要程序来实现。现在不用了,
SQL
Server 2005支持递归
查询
了(Oracle和DB2早支持了)。写法如下:假设表中的上下级关系采用的是ID和Paren