Господа, помогите, плиз.
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. Пожалуйста, прочитайте вопрос перед тем, как ответить. Если что непонятно — не цепляйтесь к словам. Если что непонятно — попытаюсь объяснить.
Здравствуйте, Sinix, Вы писали:
S>P.S. Не предлагайте спросить на SQL.RU. Злые они там.
Не знаю как насчет тех кто пишет на форум SQL Server, но на форуме по Oracle очень даже добрые на мой взгляд даже слишком временами.
Здравствуйте, chp, Вы писали:
chp>Здравствуйте, Sinix, Вы писали:
S>>P.S. Не предлагайте спросить на SQL.RU. Злые они там.
chp>Не знаю как насчет тех кто пишет на форум SQL Server, но на форуме по Oracle очень даже добрые на мой взгляд даже слишком временами.
Не предлагайте спросить на SQL.RU. Злые они там.
а почему в чем причина