powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка
9 сообщений из 9, страница 1 из 1
Задачка
    #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
Задачка
    #32007066
bitoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если я правильно понял условие, то:

select ParentID=44, ChildID from TBL where ParentID<>44
union all
select ParentID, ChildID from TBL where ParentID<>44
...
Рейтинг: 0 / 0
Задачка
    #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
Задачка
    #32007078
Спасибо

Но я не упомянул одно условие, уровней может быть не ограниченно
И если внести 45, 44, то все перестает работать
...
Рейтинг: 0 / 0
Задачка
    #32007079
bitoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно чуть подробней,
еще раз, о каких уровнях мы говорим?
...
Рейтинг: 0 / 0
Задачка
    #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
Задачка
    #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
Задачка
    #32007136
Спасибо
Да, идея с циклами мне понравилась.
...
Рейтинг: 0 / 0
Задачка
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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