sqlserver列递归遍历表里面的数据 sqlserver递归 sql语句高级应用 sql递归查询 sql查询优化 sql组织结构查询优化 sqlwith使用

songjun_java_bbs 2010-10-29 01:47:39

select * from tab_org
select * from tab_orgcode

select * from tab_org where node_id='010001'
select distinct node2 from tab_org
where node1='010001' and node2 is not null and node2<>''

select distinct node3 from tab_org
where node2 in(
select distinct node2 from tab_org
where node1='010001' and node2 is not null and node2<>''
) and node3 is not null and node3<>''

select distinct node4 from tab_org
where node3 in(
select distinct node3 from tab_org
where node2 in(
select distinct node2 from tab_org
where node1='010001' and node2 is not null and node2<>''
) and node3 is not null and node3<>''
) and node3 is not null and node3<>''
/*
*这样的查询一共有12级可以在中间任何一个节点进行查询归属该节点下面的节点
*
*请高手指点
*/
...全文
887 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
songjun_java_bbs 2010-10-29
  • 打赏
  • 举报
回复

/*表结构是这样的*/
create talbe tab_org
(
Nodeid varchar(10),
node1 varhcar(10),
node2 varhcar(10),
node3 varhcar(10),
node4 varhcar(10),
node5 varhcar(10),
node6 varhcar(10),
node7 varhcar(10),
node8 varhcar(10),
node9 varhcar(10),
node10 varhcar(10),
node10 varhcar(11),
node10 varhcar(12)
)
现在用的是前六级用到node6

数据是这样的
/*
010001 010001
020001 010001 020001
020002 010001 020002
020003 010001 020003
030001 010001 020001 030001
030002 010001 020001 030002
030003 010001 020001 030003
030004 010001 020001 030004
030005 010001 020001 030005
030006 010001 020002 030006
030007 010001 020002 030007
030008 010001 020003 030008
040001 010001 020001 030004 040001
040002 010001 020001 030002 040002
040003 010001 020001 030002 040003
040004 010001 020001 030002 040004
040005 010001 020003 030008 040005
050001 010001 020001 030004 040001 050001
050002 010001 020001 030004 040001 050002
050003 010001 020001 030004 040001 050003
050005 010001 020001 030004 040001 050005
050006 010001 020001 030004 040001 050006
050007 010001 020003 030008 040005 050007
060001 010001 020003 030008 040005 050007 060001
*/

我尝试过使用cte 但是没有攻下来
dawugui 2010-10-29
  • 打赏
  • 举报
回复

/*
标题:SQL SERVER 2005中查询指定节点及其所有子节点的方法(表格形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-02-02
地点:新疆乌鲁木齐
*/

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
go

DECLARE @ID VARCHAR(3)

--查询ID = '001'的所有子节点
SET @ID = '001'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.PID = B.ID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
001 NULL 广东省
002 001 广州市
003 001 深圳市
004 002 天河区
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇

(10 行受影响)
*/

--查询ID = '002'的所有子节点
SET @ID = '002'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.PID = B.ID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
002 001 广州市
004 002 天河区

(2 行受影响)
*/

--查询ID = '003'的所有子节点
SET @ID = '003'
;WITH T AS
(
SELECT ID , PID , NAME
FROM TB
WHERE ID = @ID
UNION ALL
SELECT A.ID , A.PID , A.NAME
FROM TB AS A JOIN T AS B ON A.PID = B.ID
)
SELECT * FROM T ORDER BY ID
/*
ID PID NAME
---- ---- ----------
003 001 深圳市
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇

(7 行受影响)
*/

drop table tb

--注:除ID值不一样外,三个SQL语句是一样的。
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
;with cte as
(
select * from tab_org where node_id='010001'
union all
select a.* from tab_org a join cte b on a.node1=b.node_id
)
select * from cte
dawugui 2010-10-29
  • 打赏
  • 举报
回复

/*
标题:SQL SERVER 2000中查询指定节点及其所有子节点的函数(表格形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-05-12
地点:广东深圳
*/

create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go

--查询指定节点及其所有子节点的函数
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)
as
begin
declare @level int
set @level = 1
insert into @t_level select @id , @level
while @@ROWCOUNT > 0
begin
set @level = @level + 1
insert into @t_level select a.id , @level
from tb a , @t_Level b
where a.pid = b.id and b.level = @level - 1
end
return
end
go

--调用函数查询001(广东省)及其所有子节点
select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
001 NULL 广东省
002 001 广州市
003 001 深圳市
004 002 天河区
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇

(所影响的行数为 10 行)
*/

--调用函数查询002(广州市)及其所有子节点
select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
002 001 广州市
004 002 天河区

(所影响的行数为 2 行)
*/

--调用函数查询003(深圳市)及其所有子节点
select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
003 001 深圳市
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇

(所影响的行数为 7 行)
*/

drop table tb
drop function f_cid



@@ROWCOUNT:返回受上一语句影响的行数。
返回类型:integer。
注释:任何不返回行的语句将这一变量设置为 0 ,如 IF 语句。
示例:下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。

UPDATE authors SET au_lname = 'Jones' WHERE au_id = '999-888-7777'
IF @@ROWCOUNT = 0
print 'Warning: No rows were updated'

结果:

(所影响的行数为 0 行)
Warning: No rows were updated

SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
CTE递归

700

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧