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