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. Пожалуйста, прочитайте вопрос перед тем, как ответить. Если что непонятно — не цепляйтесь к словам. Если что непонятно — попытаюсь объяснить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.