Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

id @ parent [D7, MSSQL]


bon ©   (2006-06-13 16:11:00) 

Есть 2 табл., хранящие древовидные структуры

tab1 (id1 int identity (1,1)
       parent1 int,
       ...............)

tab2 (id2 int identity (1,1)
       parent2 int,
       .........)
Как выполнить insert из tab1 в tab2 и при этом переприсвоить значения парент'ов


saxon   (2006-06-13 17:49:00) [1]

Хотя погарячился я. Извините.
Всетаки -> Ega23 ©   (13.06.06 16:50) [6]


saxon   (2006-06-13 17:45:00) [2]

А как создаються значения id ?
если инкрементом или типа того (т.е. их можно отсортировать по возрастанию), то мне кажеться, все сработает и простым проходом.


MOA   (2006-06-13 17:18:00) [3]

Согласен. Да, в пре-2005 без курсора не выйдет, действительно ;(. Облажался. Приношу многословные извинения. Погорячился :(.


Ega23   (2006-06-13 17:15:00) [4]


> такой способ рекомендовался в BOL MSSQL 6.5 (пример назывался
> "обход дерева", но в BOL для 2000 я его не нашёл ;().


От "листа" к "корню" - безусловно while достаточно. А в обратную сторону - боюсь что нет...


MOA   (2006-06-13 17:11:00) [5]

Можно (а может и лучше) без курсора.
Дла pre-MSSQL2005 - WHILE - ом через временные таблицы - скорее всего будет быстрее чем курсором, такой способ рекомендовался в BOL MSSQL 6.5 (пример назывался "обход дерева", но в BOL для 2000 я его не нашёл ;(). Итераций в WHILE будет столько сколько уровней в дереве, в каждом WHILE - выборка прямых потомков.
Если 2005 - можно ещё красивей, там появились возможности рекурсивных запросов и возврата наборов из INSERT и DELETE.
Удачи!


Ega23   (2006-06-13 16:50:00) [6]

Тогда - курсор, по-другому - никак. А в самом поганом случае - ещё и рекурсия.


bon   (2006-06-13 16:40:00) [7]

таб1 хранит шаблоны, которые в дальнейшем использую для inserta в табл2


bon   (2006-06-13 16:37:00) [8]

Ega23 ©   (13.06.06 16:34) [3]

tab2 не пустая


Ega23   (2006-06-13 16:34:00) [9]

tab2 перед операцией заливки данных пустая, или нет?


stud   (2006-06-13 16:27:00) [10]

наверное делаеш инсерт в табл. 1, после инсерта получаеш новый ид, и смотриш в первой таблице у кого парент=старому ид вставленой записи и делаш апдейт.


Vlad   (2006-06-13 16:19:00) [11]


> bon ©   (13.06.06 16:11)  

Если есть foreign key (parent -> id), то можно сделать в два этапа. Сначала insert без parent, потом update поле parent.


Наверх

Титульная страница Поиск, карта сайта Написать письмо