Мой Kbyte.Ru
Рассылка Kbyte.Ru
Группы на Kbyte.Ru
Партнеры Kbyte.Ru
Реклама
Сделано руками
Сделано руками
> Исходные коды - Алексей Немиро -

Microsoft SQL Server - Общие вопросы

Все примеры / Общие вопросы

Простое дерево

Автор: Алексей Немиро | добавлено: 08.02.2011, 21:23 | просмотров: 4086 (1+) | комментариев: 0 | рейтинг: *x6
Пример демонстрирует построение в 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-дизайном, увлекается фото- и видеосъемкой.

См. также:
Профиль автора
Алексей Немиро
Последние комментарии (всего: 0)

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учетная запись на Kbyte.Ru, пройдите процедуру авторизации OpenID.
Если Вы еще не зарегистрированы на Kbyte.Ru - зарегистрируйтесь.


Нет комментариев...

Авторизация
 
OpenID
Зарегистрируйся и получи 10% скидку на добавление своего сайта в каталоги! Подробнее »
Поиск по сайту
Люди на Kbyte.Ru
Реклама
Счетчики