2015-08-11 5 views
0

Это мой первый пост, я пытаюсь сделать таблицу дерева sql, которая проходит. Например, если человек нажимает на раскрывающийся список под названием «Категории», он отображает «Электрический» и «Интер». Затем, если пользователь нажмет на электрическое устройство, он выведет реле и переключатели, а затем, если человек нажмет на реле, он упадет на X-реле, и если человек нажимает на переключатели, он будет сбрасывать Y-переключатели. Я сделал попытку ниже, но часть, которую я не понимаю, - это если у меня есть другая категория InterC, как я могу сделать это еще один уровень выпадающих списков?SQL Tree/Иерархические данные

Таблица Категория

insert test select 1, 0,'Electric' 
insert test select 2, 1,'Relays' 
insert test select 3, 1,'Switches' 
insert test select 5, 2,'X Relays' 
insert test select 6, 2,'Y Switches' 
insert test select 7, 0,'InterC' 
insert test select 8, 1,'x Sockets' 
insert test select 9, 1,'y Sockets' 
insert test select 10, 2,'X Relays' 
insert test select 11, 2,'Y Relays' 
; 

create table test(id int,parentId int,name varchar(50)) 
WITH tree (id, parentid, level, name) as ( 
    SELECT id, parentid, 0 as level, name 
    FROM test WHERE parentid = 0 
    UNION ALL 
    SELECT c2.id, c2.parentid, tree.level + 1, c2.name  
    FROM test c2 
    INNER JOIN tree ON tree.id = c2.parentid 
) 
SELECT * 
FROM tree 
order by parentid 
+0

Microsoft SQL Server – turb03D

ответ

0

Ваш иерархическая T-SQL запрос должен вернуть все записи в таблице, и те под Electric и InterC.

Однако, вы должны сделать parentId нулевым и иметь корневые записи null, а не 0. Это позволит вам добавить внешний ключ, защищающий целостность данных (по ошибке невозможно будет добавить потерянные записи).

Запрос иерархии возвращает все ваши записи, я предполагаю, что вы хотите вернуть только по одному - для этого добавьте условие where к исходному запросу.

WITH tree (id, parentid, level, name) as ( 
    SELECT id, parentid, 0 as level, name 
    FROM test  
    WHERE name = @category AND 
     parentId is null 
    UNION ALL 
    SELECT c2.id, c2.parentid, tree.level + 1, c2.name  
    FROM test c2 
     INNER JOIN tree ON tree.id = c2.parentid 
) 
SELECT * 
FROM tree 
order by parentid 

Затем установите @category в 'Electric' или 'InterC', чтобы получить тот или иной иерархии.

+0

Прошу прощения, что вы имеете в виду set @category для электрических или interc? – turb03D

+0

@ turb03D '@ category' является параметром SQL:' declare @category varchar (50) = 'Electric'', чтобы установить его в SQL, но вы должны передавать параметры, используя объект соединения, который вы используете для выполнения SQL. Это будет нечто вроде 'sqlCommand.Text =" {ваш запрос} "; sqlCommand.AddParameter («категория», «электрический»). – Keith

+0

Можно ли установить оба так, чтобы их можно было динамически использовать? – turb03D

Смежные вопросы