MS-SQL 2005. Реализация дерева. Выбор корневых узлов.
От: Sinix  
Дата: 02.10.06 01:16
Оценка:
Господа, помогите, плиз.

1) Есть дерево. типичное дерево. ID, ID родительского, имя узла.

2) Выбираются некоторые узлы этого дерева.

3) Для каждого из выбранных узлов выбирается сам узел и все его подузлы.

4) Результаты группируются

В конце-концов получаем несколько новых деревьев. Для каждого выбранного узла строится своё, однако одно новое дерево может входить в другое.

Однако есть проблема — у корневых узлов новых деревьев остаётся старый родительский ID. Его надо заменить на Null.
В настоящем запросе ещё куча заморочек, но в конечном счёте надо получить только выбранные (root marked) узлы
(см. ViewAnchorNodes).

Скрипт:

USE tempdb
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/* Creating sample Tree table. */

IF (OBJECT_ID('dbo.Tree') IS NOT NULL)
  DROP TABLE dbo.Tree
GO
CREATE TABLE dbo.Tree(
      UID INT NOT NULL,
      Parent_UID INT NULL,
      NodeName NVARCHAR(50) NOT NULL,
  CONSTRAINT PK_Folders 
    PRIMARY KEY CLUSTERED (UID ASC) WITH (IGNORE_DUP_KEY = OFF)
)
--------------------------------
GO

/* Populating the Tree table with values. */

INSERT dbo.Tree VALUES (1, Null, '1')
INSERT dbo.Tree VALUES (2, 1, '1\1 - Marked as Root, Parent_UID will be Null')
INSERT dbo.Tree VALUES (3, 1, '1\2')
INSERT dbo.Tree VALUES (4, 3, '1\2\1')
INSERT dbo.Tree VALUES (5, 4, '1\2\1\1 - Marked as Root, Parent_UID will be 4')
--------------------------------
GO

/* Creating stub for view used to display id of root marked nodes. */

IF (OBJECT_ID('dbo.ViewRootNodes') IS NOT NULL)
  DROP VIEW dbo.ViewRootNodes
GO
CREATE VIEW dbo.ViewRootNodes AS
  SELECT 2 AS UID /* UID of first marked node */
    --,1 AS Parent_UID -- Parent_UID of first marked node
      /* View may be refactored 
         to display parent id's too,
         but it seems to be useless
         and introduce perfomance penalties */
  UNION ALL
  SELECT 5 /* UID of secont marked node */
    --,4 %af_src_comm_6
--------------------------------
GO


/* Creating stub for view used to display root marked nodes */

/*
    TODO: Realize :)  
    (see comments below Parent_UID columns).
 */
IF (OBJECT_ID('dbo.ViewAnchorNodes') IS NOT NULL)
  DROP VIEW dbo.ViewAnchorNodes
GO
CREATE VIEW dbo.ViewAnchorNodes AS
  SELECT 2 AS UID,
         NULL AS Parent_UID
         /*
           Parent_UID will be NULL, because
           node wtih UID = 2 hasn't any
           parent root marked nodes.
         */,
         '1\1 - Marked as Root, Parent_UID will be Null' AS NodeName
  UNION ALL
  SELECT 5,
         4
         /*
           Parent_UID will be 4, because
           node with UID = 5 has
           parent root marked node with UID = 2.
         */,
         '1\2\1\1 - Marked as Root, Parent_UID will be 4'
--------------------------------
GO

/* Selecting values */
SELECT * FROM dbo.Tree
SELECT * FROM dbo.ViewRootNodes
SELECT * FROM dbo.ViewAnchorNodes
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO



P.S. Не предлагайте спросить на SQL.RU. Злые они там.
P.P.S. Пожалуйста, прочитайте вопрос перед тем, как ответить. Если что непонятно — не цепляйтесь к словам. Если что непонятно — попытаюсь объяснить.
Re: MS-SQL 2005. Реализация дерева. Выбор корневых узлов.
От: Sinix  
Дата: 02.10.06 04:32
Оценка:
Пошли по тру пути — поменяли архитектуру)
Всегда бы так.
Тема закрыта.
Re: MS-SQL 2005. Реализация дерева. Выбор корневых узлов.
От: chp Россия  
Дата: 02.10.06 07:36
Оценка:
Здравствуйте, Sinix, Вы писали:
S>P.S. Не предлагайте спросить на SQL.RU. Злые они там.
Не знаю как насчет тех кто пишет на форум SQL Server, но на форуме по Oracle очень даже добрые на мой взгляд даже слишком временами.
Re[2]: MS-SQL 2005. Реализация дерева. Выбор корневых узлов.
От: Аноним  
Дата: 02.10.06 08:41
Оценка:
Здравствуйте, chp, Вы писали:

chp>Здравствуйте, Sinix, Вы писали:

S>>P.S. Не предлагайте спросить на SQL.RU. Злые они там.
chp>Не знаю как насчет тех кто пишет на форум SQL Server, но на форуме по Oracle очень даже добрые на мой взгляд даже слишком временами.

Не предлагайте спросить на SQL.RU. Злые они там.
а почему в чем причина
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.