日期:2014-05-17  浏览次数:20477 次

高手帮忙:sql 里怎样递归判断父节点和子节点的关系?(附图和详细说明)
如题,如下表,tdma01是目录,tdma03是上层目录名:
比如word_test_test的上层目录是DMA20120317004(word_test),DMA20120317004的上层目录是DMA20120313004(word),DMA20120313004的上层目录是DMA20120313001(office重要文件,其中root是根目录。
如图:
[img=http://b101.photo.store.qq.com/psb?/V10aAZXn0KNmAV/BG2m5rrZuPTORl75ywC2osjcCc0CCZ32MprhM14VGZY!/b/YfH4NzzxFAAAYiAwRDwLFQAA][/img]



现在假如word的上层目录变为test1234,则包括word和其下层的所有目录也不显示出来即word和其下面的word_test以及word_test_test都不要显示出来。
如图:

[img=http://b100.photo.store.qq.com/psb?/V10aAZXn0KNmAV/brfMRMfQah.rXZeR4uWtcGc*o.0wJZlp7HvrvKGVJMM!/b/YSzgnTtMFQAAYsEJpzsxFgAA][/img]

我用的是嵌套子查询,只做了三层目录的嵌套,如果还有四层,五层目录则再嵌套之前的语句,非常笨而且比较死的方法,其中role001是一个带进来的参数,可以忽略不管。
代码如下:

select * from
(
select * from 
(
select * from tlpdmd  where tlpdmd01='role001'  
and tdma03   
not in(select  tdma03 from tlpdmd where tdma03 not in(select tdma01 from tlpdmd) and tdma03<>'root') 
) x 
where x.tdma03  
 in

select tdma01 from tlpdmd  where tlpdmd01='role001'  
and tdma03   
not in(select  tdma03 from tlpdmd where tdma03 not in(select tdma01 from tlpdmd) and tdma03<>'root') 
) or x.tdma03='root'
)y 
where y.tdma03
in
(
select tdma01 from 
(
select * from tlpdmd  where tlpdmd01='role001'  
and tdma03   
not in(select  tdma03 from tlpdmd where tdma03 not in(select tdma01 from tlpdmd) and tdma03<>'root') 
) x 
where x.tdma03  
 in

select tdma01 from tlpdmd  where tlpdmd01='role001'  
and tdma03   
not in(select  tdma03 from tlpdmd where tdma03 not in(select tdma01 from tlpdmd) and tdma03<>'root') 
) or x.tdma03='root'

) or y.tdma03='root'



现在想寻求通用科学的写法?

------解决方案--------------------
图挂了
------解决方案--------------------

USE tempdb
GO

-- 建立演示环境
CREATE TABLE Dept(
 id int PRIMARY KEY, 
 parent_id int,
 name nvarchar(20))
INSERT Dept
SELECT 0, 0, N'<全部>' UNION ALL
SELECT 1, 0, N'财务部' UNION ALL
SELECT 2, 0, N'行政部' UNION ALL
SELECT 3, 0, N'业务部' UNION ALL
SELECT 4, 0, N'业务部' UNION ALL
SELECT 5, 4, N'销售部' UNION ALL
SELECT 6, 4, N'MIS' UNION ALL
SELECT 7, 6, N'UI' UNION ALL
SELECT 8, 6, N'软件开发' UNION ALL
SELECT 9, 8, N'内部开发'
GO

-- 查询指定部门下面的所有部门
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(
 -- 定位点成员
 SELECT * FROM Dept
 WHERE name = @Dept_name
 UNION