Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка / 9 сообщений из 9, страница 1 из 1
06.06.2001, 10:31
    #32007050
Задачка
Привет всем !!!

Есть задачка
таблица из двух полей
ParentID, ChildID
44, 43
44, 42
42, 32
42, 41
43, 20
43, 21
43, 22

Хотелосьбы на выходе получить
44, 32
44, 41
44, 20
44, 21
44, 22
42, 32
42, 41
43, 20
43, 21
43, 22

т.е. есть какбы последовательности 44,42,32 или 44,42,41
хотелось бы получить концы ParentID, LastChildID
Вообщем задача решена, но хотелось бы найти другие методы решения

Спасибо
...
Рейтинг: 0 / 0
06.06.2001, 14:21
    #32007066
bitoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
если я правильно понял условие, то:

select ParentID=44, ChildID from TBL where ParentID<>44
union all
select ParentID, ChildID from TBL where ParentID<>44
...
Рейтинг: 0 / 0
06.06.2001, 14:58
    #32007076
rrr5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
А можно так:

select t2.ParentID,t1.ChildId
from t t1 inner join t t2 on t1.ParentId=t2.ChildId

union all

select t2.ParentId,t2.ChildId from
t t1 right outer join t t2 on t1.ParentId=t2.ChildId
where
t1.ParentID is null
...
Рейтинг: 0 / 0
06.06.2001, 15:14
    #32007078
Задачка
Спасибо

Но я не упомянул одно условие, уровней может быть не ограниченно
И если внести 45, 44, то все перестает работать
...
Рейтинг: 0 / 0
06.06.2001, 15:30
    #32007079
bitoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
можно чуть подробней,
еще раз, о каких уровнях мы говорим?
...
Рейтинг: 0 / 0
06.06.2001, 15:41
    #32007080
Задачка
Уровни наследования ( можно и так назвать )
т.е. при внесении 45, 44
должно получиться
45, 32
45, 41
45, 20
45, 21
45, 22
44, 32
44, 41
44, 20
44, 21
44, 22
42, 32
42, 41
43, 20
43, 21
43, 22
т.е. полследовательность наследования, если ее разложить в строку получится след.
например 45,44,42,32

Спасибо
...
Рейтинг: 0 / 0
06.06.2001, 16:34
    #32007084
Задачка
Одним запросом, при такой структуре, по-моему не обойтись.

Я бы сначала выбрал бездетных детей, потом их родителей, бабушек, прадедушек и
так по всему дереву :



create table #tmp (ParentId int,ChildId int)

--выбираем бездетных с родителями
Insert #tmp (ParentId,ChildId )
select distinct t1.ParentId,t1.ChildId
from T as t1
where t1.ChildId not in (select t2.ParentId from T as t2)

--выбираем всех остальных
WHILE 1=1
BEGIN
Insert #tmp(ParentId,ChildId )
select distinct t1.ParentId,t2.ChildId
from T t1 inner join #tmp t2 on (t1.ChildId=t2.ParentId)
where not Exists(select * from #tmp t3 where t3.ParentId=t1.ParentId and t3.ChildId=t2.ChildId)
IF @@ROWCOUNT=0 BREAK
END

select * from #tmp

drop table #tmp



C уважением,
Курков Михаил.
...
Рейтинг: 0 / 0
07.06.2001, 09:30
    #32007136
Задачка
Спасибо
Да, идея с циклами мне понравилась.
...
Рейтинг: 0 / 0
07.06.2001, 09:53
    #32007142
zamm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Я, конечно понимаю, что классика требует для работы с деревьями использование рекурсий, но
если задача заключается найти все листья для конкретного узла, то можно так по простенькому

@declare uselID int
set @uselID=45

create table #tab(chID int,isLeaf int)
-- elLeaf будет содержать : 0-не лист, 1-лист
insert into #tab (chID,isLeaf)
select ChildID,0 from TreeTbl where ParentID=@uselID
declare cur cursor for
select chID,isLeaf from #tab
open cur
declare @chID int,@isLeaf int
while 1=1 begin
fetch next from cur into @chID,@isLeaf
if @@FETCH_STATUS=-1
break
if exists(select * from TreeTbl where ParentID=@chID)
insert into #tab (chID,isLeaf) select ChildID,0 from TreeTbl where ParentID=@chID
else
update #tab set isLeaf=1 where currient of cur
end
close cur
deallocate cur

select chID from #tab where isLeaf=1
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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