powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти всех потомков?
6 сообщений из 6, страница 1 из 1
Как найти всех потомков?
    #32043138
rmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть табличка hirearhy(object_id int, parent_id int), задающая дерево, и табличка objects(id int, is_parent int), определяющая, является ли объект предком или нет. Нужно выбрать всех потомков объекта. Как это сделать?
...
Рейтинг: 0 / 0
Как найти всех потомков?
    #32043159
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была у меня такая задачка надо было хранить структуру похожую на файловую систему. Сделал а все в одной табле
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
...
Рейтинг: 0 / 0
Как найти всех потомков?
    #32043180
rmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал процедуру по образу и подобию написанной. Она ищет всех потомков за 7 секунд
Написал функцию на основе процедуры (заменил создание таблиц на переменные типа table). Запустил на выполнение. Подождал 3 минуты, после чего отменил выполнение. Почему такая разница в производительности?
...
Рейтинг: 0 / 0
Как найти всех потомков?
    #32043182
rmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вдогонку...
Функция все-таки выполняется
за 3:44 на 6 тысячах записей
...
Рейтинг: 0 / 0
Как найти всех потомков?
    #32043219
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле это делается с помощью одной вспом таблицы, и соответственно без очистки-заполнения буфера \r
Можно посмотреть здесь\r
/topic/5659\r
или здесь\r
/topic/10197\r
или здесь\r
/topic/1701
...
Рейтинг: 0 / 0
Как найти всех потомков?
    #32043402
rmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти всех потомков?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]