Пример демонстрирует построение в T-SQL простого двухуровневого дерева. В примере используется временная таблица, в которую сначала добавляется родительский элемент, затем дочерние. Так происходит до тех пор, пока в конечной таблице не окажутся все родительские и дочерние элементы.
Код
-- таблица категорий, для демонстрации работы примера
DECLARE @categories TABLE (id int identity, parent_id int, name nvarchar(50));
-- id - идентификатор категории
-- parent_id - идентификатор родителя
-- name - имя категории
-- заполняем таблицу данными
INSERT INTO @categories
SELECT 0, 'Программирование'; -- 1
INSERT INTO @categories
SELECT 1, 'Visual Basic';
INSERT INTO @categories
SELECT 1, 'C++';
INSERT INTO @categories -- 4
SELECT 0, 'Веб-программирование';
INSERT INTO @categories
SELECT 1, 'Delphi';
INSERT INTO @categories
SELECT 4, 'ASP .NET';
INSERT INTO @categories
SELECT 4, 'PHP';
INSERT INTO @categories
SELECT 0, 'Базы данных'; -- 8
INSERT INTO @categories
SELECT 8, 'SQL Server';
INSERT INTO @categories
SELECT 4, 'Perl';
INSERT INTO @categories
SELECT 1, 'C#';
INSERT INTO @categories
SELECT 1, 'Pascal';
INSERT INTO @categories
SELECT 8, 'MySql';
INSERT INTO @categories
SELECT 8, 'Oracle';
-- строим дерево
DECLARE @tree TABLE (id int identity, category_id int, parent_id int, name nvarchar(50));
-- берем первую родительскую категории
DECLARE @lastId int;
SELECT TOP 1 @lastId = id FROM @categories WHERE parent_id = 0 ORDER BY name ASC;
-- листаем циклом до тех пор, пока запрос SELECT
-- возвращает более нуля строк данных
WHILE @@ROWCOUNT > 0 BEGIN
-- добавляем родителя
INSERT INTO @tree
SELECT id, parent_id, name FROM @categories WHERE id = @lastId;
-- добавляем детей в родителя
INSERT INTO @tree
SELECT id, parent_id, name FROM @categories WHERE parent_id = @lastId ORDER BY name ASC;
-- следующая родительская категория, которой еще нет в результате
SELECT TOP 1 @lastId = id FROM @categories
WHERE parent_id = 0 AND id NOT IN (SELECT category_id FROM @tree WHERE parent_id = 0)
ORDER BY name ASC;
END;
-- дерево готово, выводим
SELECT * FROM @tree;
Интернет-деятель. Автор многочисленных статей и переводов статей по программированию и информационным технологиям. Работы Алексея можно найти в популярных печатных изданиях компьютерной тематики. Автор проекта Kbyte.Ru. Сейчас Алексей занимается профессиональным Web-программированием на базе технологий .NET Framework. Иногда пишет различные программки и компоненты для Windows и Android. В свободное время занимается Web-дизайном, увлекается фото- и видеосъемкой.
Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учетная запись на Kbyte.Ru, пройдите процедуру авторизации.
Если Вы еще не зарегистрированы на Kbyte.Ru - зарегистрируйтесь.