Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перебор строк и присоединение  [new]
titans
Member

Откуда:
Сообщений: 73
Всем привет. Помогите мне допилить процедуру.
У меня есть такая таблица
Main
idnameid_parent
1ANULL
2B1
3C1
4D2
5D3
6E3


Мне нужно в итоге получить такую таблицу:
iddomen1domen2domen3
1ABD
2ACD
3ACE


Я начал делать процедуру, и запнулся на том, что я не работал с курсором, т.к. мне каждую строку надо перебрать.

create procedure GetTableFromId
@id_p int as
declare @counter int
select @counter=count(id_parent) From Main Where id_parent=@id_p
if @counter=0
begin
	Select name from Main Where id=@id_p
end
else
begin
	DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM Main
	OPEN CURSOR_TYPE

	FETCH NEXT FROM CURSOR_TYPE 
	WHILE @@FETCH_STATUS = 0
	BEGIN
                //Тут надо сделать перебор полей, у которых родитель @id_p и если есть дочерний элемент вызвать эту же процедуру рекурсией.
                //после этого, наверное присоединить LEFT OUTER JOIN к полям
		//FETCH NEXT FROM Employee_Cursor
                //а тут надо понять, что это первичный вызов и склеить UNION строки...
	END

	CLOSE CURSOR_TYPE
	DEALLOCATE CURSOR_TYPE
end

go

execute GetTableFromId 1
16 май 13, 14:12    [14305504]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Glory
Member

Откуда:
Сообщений: 104751
titans
Мне нужно в итоге получить такую таблицу:
iddomen1domen2domen3
1ABD
2ACD
3ACE

Вы хотите сказать, что у вас всегда 3 уровня вложенности ?
16 май 13, 14:14    [14305527]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
И сколько у вас уровней вложенности допускается?

Да, кстати, select @@version будьте добры.
16 май 13, 14:14    [14305532]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
titans
Member

Откуда:
Сообщений: 73
Ennor Tiegael,

Ну вообще по заданию три. Но хотелось бы предусмотреть вариант бесконечной вложенности.
16 май 13, 14:21    [14305588]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
titans
Member

Откуда:
Сообщений: 73
если возможно....
16 май 13, 14:21    [14305594]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Glory
Member

Откуда:
Сообщений: 104751
titans
Но хотелось бы предусмотреть вариант бесконечной вложенности.

Бесконечного числа полей не может быть
16 май 13, 14:21    [14305595]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
titans
Ну вообще по заданию три. Но хотелось бы предусмотреть вариант бесконечной вложенности.
Бесконечно точно не получится - у сиквела есть лимит на предельное количество столбцов в селекте, 1024 вроде было.

Если же конечно, но переменно - то только генерацией динамического SQL и его выполнением.
16 май 13, 14:23    [14305620]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
titans
Member

Откуда:
Сообщений: 73
Просто насколько я понимаю подвох в задании. Вложенности как может и не быть, так она может и (опять же по условию) быть одноуровневая, двух двухуровневая...
16 май 13, 14:24    [14305623]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
titans
Member

Откуда:
Сообщений: 73
Я к чему веду, что бы не прописывать статически условиями уровни вложенности. Понятно, что лимит будет.
16 май 13, 14:25    [14305640]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Glory
Member

Откуда:
Сообщений: 104751
titans
Я к чему веду, что бы не прописывать статически условиями уровни вложенности. Понятно, что лимит будет.

Динамическое количество полей может быть только в динамическом запросе.
16 май 13, 14:26    [14305661]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
titans,

Если подозреваете подвох, то давайте сюда точную формулировку задания.
16 май 13, 14:29    [14305683]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк и присоединение  [new]
aleks2
Guest
titans
Ennor Tiegael,

Ну вообще по заданию три. Но хотелось бы предусмотреть вариант бесконечной вложенности.


Вот не надо изобретать

declare @main table(id int primary key clustered, name char(1), id_parent int);

insert @main
  values (1, 'A', NULL)
       , (2, 'B', 1)
       , (3, 'C', 1)
       , (4, 'D', 2)
       , (5, 'D', 3)
       , (6, 'E', 3)
;

select row_number() over(order by m1.id, m2.id, m2.id) as id
      , m1.name as domain1
      , m2.name as domain2
      , m3.name as domain3
  from @main m1 
       left outer join @main m2 on m2.id_parent = m1.id 
       left outer join @main m3 on m3.id_parent = m2.id 
  where m1.id_parent is null
17 май 13, 06:24    [14309149]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить