2011-08-02 81 views
0

我想從下往上查詢單個數據庫表中的數據層次結構(我不想包含父類沒有特定類型的孩子由於當局)。架構和樣本數據如下:使用Sql Server 2005篩選自底向上的遞歸CTE

create table Users(
id int, 
name varchar(100)); 

insert into Users values (1, 'Jill'); 

create table nodes(
    id int, 
    name varchar(100), 
    parent int, 
    nodetype int); 

insert into nodes values (1, 'A', 0, 1); 
insert into nodes values (2, 'B', 0, 1); 
insert into nodes values (3, 'C', 1, 1); 
insert into nodes values (4, 'D', 3, 2); 
insert into nodes values (5, 'E', 1, 1); 
insert into nodes values (6, 'F', 5, 2); 
insert into nodes values (7, 'G', 5, 2); 

create table nodeAccess(
    userid int, 
    nodeid int, 
    access int); 

insert into nodeAccess values (1, 1, 1); 
insert into nodeAccess values (1, 2, 1); 
insert into nodeAccess values (1, 3, 1); 
insert into nodeAccess values (1, 4, 1); 
insert into nodeAccess values (1, 5, 1); 
insert into nodeAccess values (1, 6, 0); 
insert into nodeAccess values (1, 7, 1); 


with Tree(id, name, nodetype, parent) 
as 
(
    select n.id, n.name, n.nodetype, n.parent 
    from nodes as n 
    inner join nodeAccess as na on na.nodeid = n.id 
    where na.access =1 and na.userid=1 and n.nodetype=2 

    union all 

    select n.id, n.name, n.nodetype, n.parent 
    from nodes as n 
    inner join Tree as t on t.parent = n.id 
    inner join nodeAccess as na on na.nodeid = n.id 
    where na.access =1 and na.userid=1 and n.nodetype=1 
) 
select * from Tree 

產量:

id name nodetype parent 
    4 D  2    3 
    7 G  2    5 
    5 E  1    1 
    1 A  1    0 
    3 C  1    1 
    1 A  1    0 

我能不包括在結果中設定副本?針對真實表的查詢在最低級別具有更多的節點,因此父節點的重複次數更多。該解決方案需要與至少SQL Server 2005一起工作。

在此先感謝!

回答

0

最簡單的(不一定是最有效的)解決方案:

... 
) 
SELECT DISTINCT id,name,nodetype,parent FROM Tree; 

這從您的樣品輸出會改變順序,因爲DISTINCT運營商實現了一種。如果有一些故意訂購,我無法檢測到,但如果您知道所需的訂單,則可以添加ORDER BY