Фильтрация восходящего рекурсивного CTE с Sql Server 2005 - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь запросить иерархию данных в одной таблице базы данных снизу вверх (я не хочу включать родителей, у которых нет определенного типа ребенка из-за полномочий). Схема и примеры данных следующие:

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.

Заранее спасибо!

1 Ответ

1 голос
/ 03 августа 2011

Самое простое (не обязательно самое эффективное) решение:

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

Это меняет порядок из вашего примера вывода, потому что оператор DISTINCT реализует сортировку. Если там есть какой-то преднамеренный заказ, я не могу его обнаружить, но вы можете добавить ORDER BY, если знаете порядок, который хотите.

...