|
|
|
Как найти всех потомков?
|
|||
|---|---|---|---|
|
#18+
Есть табличка hirearhy(object_id int, parent_id int), задающая дерево, и табличка objects(id int, is_parent int), определяющая, является ли объект предком или нет. Нужно выбрать всех потомков объекта. Как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2002, 12:38:00 |
|
||
|
Как найти всех потомков?
|
|||
|---|---|---|---|
|
#18+
Была у меня такая задачка надо было хранить структуру похожую на файловую систему. Сделал а все в одной табле CREATE TABLE [Folders] ( [UID] uniqueidentifier NOT NULL , [ID] [nvarchar] (500) NOT NULL , [ParentUID] [uniqueidentifier] NULL ) ON [PRIMARY] GO uid - это 40 значный код объекта id - его название ( типа Папка n1) parentuid - код родителей ( если Null то это папа) При удалении папки надо было удалять ее и всех ее детей Решил с помощью ХП и 3 вспом таблиц Вот код --- -- Процедура : DeleteFolders -- Параметры : @TargetUID uniqueidentifier - ключ удаляемого узла -- Назначение : Каскадное удаление папок CREATE PROCEDURE DeleteFolders @TargetUID uniqueidentifier as if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[t1] if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[t2] if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t3]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[t3] CREATE TABLE [dbo].[t1] ( [id] [nvarchar] (500) COLLATE Cyrillic_General_CI_AS NOT NULL , [uid] [uniqueidentifier] NOT NULL , [parentuid] [uniqueidentifier] NULL ) ON [PRIMARY] CREATE TABLE [dbo].[t2] ( [id] [nvarchar] (500) COLLATE Cyrillic_General_CI_AS NOT NULL , [uid] [uniqueidentifier] NOT NULL , [parentuid] [uniqueidentifier] NULL ) ON [PRIMARY] CREATE TABLE [dbo].[t3] ( [id] [nvarchar] (500) COLLATE Cyrillic_General_CI_AS NOT NULL , [uid] [uniqueidentifier] NOT NULL , [parentuid] [uniqueidentifier] NULL ) ON [PRIMARY] -- t1 - Таблица с текущими родительскими узлами -- t2 - Таблица с узлами для удаления -- t3 - Буфер для хранения текущих родительских узлов -- вставка дочерних узлов первого уровня в таблицу для удаления insert into t2 select id,uid,parentuid from folders where uid=@targetuid -- вставка ссылок на удаление insert into t1 select id,uid,parentuid FROM Folders WHERE parentuid=@TargetUID -- копируем корневой узел в t1 insert into t2 select * from t1 while @@rowcount>0 begin -- Вставка в таблицу t2 узлов для удаления insert into t2 SELECT id,uid,parentuid FROM Folders WHERE parentuid in (select uid from t1) -- Очистка буфера delete from t3 -- Запись в буфер текущих узлов insert into t3 SELECT id,uid,parentuid FROM Folders WHERE parentuid in (select uid from t1) -- Очистка таблицы текущих ссылок delete from t1 -- Вставка из буфера для следующей итерации insert into t1 select * from t3 end -- удаление папок delete from folders where uid in (select uid from t2) drop table t1 drop table t2 drop table t3 GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2002, 13:05:23 |
|
||
|
Как найти всех потомков?
|
|||
|---|---|---|---|
|
#18+
Создал процедуру по образу и подобию написанной. Она ищет всех потомков за 7 секунд Написал функцию на основе процедуры (заменил создание таблиц на переменные типа table). Запустил на выполнение. Подождал 3 минуты, после чего отменил выполнение. Почему такая разница в производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2002, 14:15:07 |
|
||
|
Как найти всех потомков?
|
|||
|---|---|---|---|
|
#18+
Вдогонку... Функция все-таки выполняется за 3:44 на 6 тысячах записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2002, 14:20:56 |
|
||
|
Как найти всех потомков?
|
|||
|---|---|---|---|
|
#18+
на самом деле это делается с помощью одной вспом таблицы, и соответственно без очистки-заполнения буфера \r Можно посмотреть здесь\r /topic/5659\r или здесь\r /topic/10197\r или здесь\r /topic/1701 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2002, 15:54:40 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3435&tid=1821122]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
21ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 297ms |

| 0 / 0 |
