Форум: "Базы";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
ВнизРекурсивная выборка из таблицы со структурой дерева Найти похожие ветки
← →
kotyara12 (2008-04-03 22:01) [0]Есть таблица (дерево), поля ID (ключ), OWNER_ID (ID записи "родителя"), NAME.... и так далее. Для "корневых" записей OWNER_ID = NULL.
Нужно для прозвольного ID выбрать саму указанную запись плюс все записи родителей вплоть до корневой.
Т.е. должно быть примерно следующее:
ID OWNER_ID NAME
1 (NULL) корневая запись
23 1 1-ый уровень
107 23 2-ой уровень
и т.д.....
Понимаю, что должна быть какая-то рекурсия, но как это реализовать на MS SQL (2000)?
← →
ага (2008-04-03 22:19) [1]
> kotyara12 (03.04.08 22:01)
рекурсивная ХП.
← →
Ega23 © (2008-04-04 00:59) [2]
> Понимаю, что должна быть какая-то рекурсия, но как это реализовать
> на MS SQL (2000)?
> ага (03.04.08 22:19) [1]
>
>
> > kotyara12 (03.04.08 22:01)
>
> рекурсивная ХП.
>
Смеетесь?create procedure MyProc
@ID int =null
as
while(@ID is not null)
begin
select @ID=owner_id
from Table
where ID=@ID;
select id, owner_id, name
into #temp
from Table
where id=@id;
end;
Select * from #temp;
return(0);
GO
← →
Ega23 © (2008-04-04 01:01) [3]
> Ega23 © (04.04.08 00:59) [2]
блин, долбаная мышка...
Часть запроса "съелась"create procedure MyProc
@ID int =null
as
select id, owner_id, name
into #temp
from Table
where id=@id;
while(@ID is not null)
begin
select @ID=owner_id
from Table
where ID=@ID;
select id, owner_id, name
into #temp
from Table
where id=@id;
end;
Select * from #temp;
return(0);
GO
← →
kotyara12 (2008-04-04 07:22) [4]
> Ega23 © (04.04.08 01:01) [3]
Сенкс...., то что надо!
← →
ага (2008-04-04 07:38) [5]
> Ega23 © (04.04.08 01:01) [3]
А.. ну да... временные таблицы.
← →
Ega23 © (2008-04-04 08:28) [6]
> А.. ну да... временные таблицы.
при чём тут временные таблицы?
задача обхода дерева от листа к корню (какоиу-то родителю) решается простым while. Задача обхода дерева от корня к листу решается рекурсией.
← →
sniknik © (2008-04-04 08:43) [7]> Задача обхода дерева от корня к листу решается рекурсией.
тоже можно "простым" while
не буду "подгонять", как есть из проекта, думаю и так понятно будет
DECLARE @Dep INT
DECLARE @Lvl INT
DECLARE @Rc INT
SET @Dep=:Dep
SET @Lvl=1
DECLARE @Tbl TABLE (ID INT PRIMARY KEY CLUSTERED,PID INT NULL,Lvl INT NOT NULL)
INSERT @tbl (ID,PID,Lvl) SELECT ID,PID,@Lvl FROM Department where PID=@Dep
SET @Rc=@@RowCount
WHILE @Rc>0 BEGIN
SET @Lvl=@Lvl+1
INSERT @Tbl (ID,PID,Lvl) SELECT d.ID, d.PID, @Lvl FROM @Tbl t INNER JOIN Department d on t.ID=d.PID WHERE t.Lvl=@Lvl-1
SET @Rc=@@RowCount
END
INSERT @tbl (ID,PID,Lvl) VALUES (@Dep, 0, 0)
SELECT
e.ID,
isNull(d.Name,"<Íå íàéäåí>") AS "Äåïàðòàìåíò",
isNull(h.Name,"<Íå íàéäåí>") AS "Îáîðóäîâàíèå",
isNull(m.Name,"<Íå íàéäåí>") AS "Ñîîáùåíèå",
isNull(m.State,0) AS "Ñòàòóñ",
ServDate AS "Âðåìÿ ñîáûòèÿ"
FROM Event e
LEFT JOIN Department d ON e.IDDepartment=d.ID
LEFT JOIN Hard h ON e.IDHard=h.ID
LEFT JOIN Message m ON e.IDDrvType=m.IDDrvType AND e.Code=m.Code
WHERE (e.IDDepartment IN (SELECT ID FROM @Tbl)) AND (e.ServDate BETWEEN @DWith AND @DTo+1) AND (m.State IN (@St1,@St2,@St3) )
ORDER BY e.ID
собственно интересующий цикл в начале, последний селект это уже выборка по набранным в "рекурсии" ключам и доп. условиям полных записей (можно не рассматривать).
← →
Ega23 © (2008-04-04 10:06) [8]Интересный приёмчик...
Запомню.. :)
← →
evvcom © (2008-04-11 10:27) [9]
> Ega23 © (04.04.08 10:06) [8]
> Интересный приёмчик...
> Запомню.. :)
Я такой уже лет несколько от того же автора здесь же сфотографировал :) Кстати, тогда он был причесан, приведена только суть )
> OWNER_ID (ID записи "родителя")
Если это родитель, то почему поле называется не PARENT_ID или ID_PARENT? Причем здесь "владелец"?
← →
ANB (2008-04-11 18:19) [10]Я на клиппере писал обход дерева без рекурсии.
Но самый простой способ - юзать для деревьев оракл. Простым селектом сам все обходит - хошь вверх, хош вниз.
← →
Johnmen © (2008-04-11 20:30) [11]
> Но самый простой способ - юзать для деревьев оракл.
Ага. Для лечения гиморроя он тоже годится.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.054 c