Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск корневых элементов дерева (классический подход)  [new]
dVirt
Member

Откуда:
Сообщений: 388
Привет всем

Есть 2 таблицы:

1) Таблица иерархический справочник
CREATE TABLE tblCatalog(
   [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
   [ParentID] [uniqueidentifier] NULL,
   [Name] [nvarchar](250) NULL,

   CONSTRAINT [PK_tblCatalog] PRIMARY KEY CLUSTERED 
   (
      [ID] ASC
   )
) ON [PRIMARY]

1) Таблица использующая иерархический справочник
CREATE TABLE tblMain(
   [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
   [CatalogID] [uniqueidentifier] NULL,
   [Text] [nvarchar](2000) NULL,

   CONSTRAINT [PK_tblMain] PRIMARY KEY CLUSTERED 
   (
      [ID] ASC
   )
) ON [PRIMARY]

Таблица tblMain содержит данные которые привязаны к иерархическому справочнику, тоесть tblMain.CatalogID Содержит tblCatalog.ID
Глубина иерархии в справочнике tblCatalog от 3 до 5 уровней. Записи в таблице tblMain привязаны к элементам tblCatalog (3-5 уровней).

ВОПРОС:
Как найти все корневые элементы tblCatalog используемые в таблице tblMain, ещё было бы неплохо подсчитать количество записей в каждом корневом элементе, чтобы например отсортировать первые уровни по убыванию.
17 ноя 11, 12:14    [11611746]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневых элементов дерева (классический подход)  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
dVirt
ещё было бы неплохо подсчитать количество записей в каждом корневом элементе
hierarchyid поможет?
17 ноя 11, 12:33    [11611968]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневых элементов дерева (классический подход)  [new]
dVirt
Member

Откуда:
Сообщений: 388
Паганель,

Конечно помог бы ктоже спорит, НО у нас 3 софтины уже юзают эту базу, сейчас вывожу данные на Web Сайт.

Как и любому другому C# разработчику использующему императивный подход, мне в голову лезут всякие "мысли":
1) А почемубы не проитерировать циклом (онже курсор);
2) А почемубы не сделать триггер с доп. столбцом, типа "RootItemID" в таблице tblCatalog, а потом просто юзать это значение;
и т.д.

В общем пробовал классическим SQL подходом основанном на множествах, пытался найти ID по ParentID и если у него ParentID IS NULL то значит корень иначе ... вот тут и нагромождение при просмотре вышестоящих уровней. И я сомневаюсь что это быстрее цикла, а вот тот факт что абсолютно не четабельно уже на 2 уровне это точно ... а их 5 ...
17 ноя 11, 12:42    [11612058]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневых элементов дерева (классический подход)  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
возможно ли такое

меня тоже вэб испортил, кучу времени на всякую фигню трачу
17 ноя 11, 12:49    [11612160]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневых элементов дерева (классический подход)  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
dVirt
Паганель,
В общем пробовал классическим SQL подходом основанном на множествах, пытался найти ID по ParentID и если у него ParentID IS NULL то значит корень иначе ... вот тут и нагромождение при просмотре вышестоящих уровней. И я сомневаюсь что это быстрее цикла, а вот тот факт что абсолютно не четабельно уже на 2 уровне это точно ... а их 5 ...

Рекурсивные CTE ещё можно попробовать.
17 ноя 11, 12:50    [11612186]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневых элементов дерева (классический подход)  [new]
dVirt
Member

Откуда:
Сообщений: 388
CTE выглядит как решение, спасибо протестирую ...
17 ноя 11, 12:57    [11612284]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить