Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Как скопировать дерево из одной таблицы в другую?


Автор: x404 26.11.2005, 00:33
Доброго времени суток!
Помогите решить такую проблему. Имеется 2 таблицы, в которых надо хранить
древовидную структуру.
Первая - ТИПОВЫЕ СТАТЬИ, а вторая - РЕАЛЬНЫЕ СТАТЬИ.

---Структура таблиц:----
Article_t (ТИПОВЫЕ СТАТЬИ):
Id_Art_t,
ParentID_t,
IsFolder_t,
Name_t

Article (РЕАЛЬНЫЕ СТАТЬИ):
Id_Art,
ParentID,
IsFolder,
Name.

Поле ParentID_t указывает на родительский ID, т.е. на родителя.
Поле IsFolder_t определяет чем является данная запись - папкой, подпапкой или статьей. Глубина подпапок не ограничена(тут у меня и возникла проблема. smile )
Name_t - имя типовой папки/подпапки/статьи.

Проблема в следующем: как мне из таблицы типовых статей (Article_t) скопировать структуру дерева в таблицу с реальными статьями(Article)? Это надо для того, чтобы, когда заводилось новое предприятие, статьи сразу же заносисись из справочника(Article_t) в реальную таблицу(Article).
БД - Sybase 6.
Язык программирования - Delphi 6.
Используется ADO.

Автор: Cashey 26.11.2005, 14:58
В исходной таблице у тебя должно быть 4 поля ID записи, ID записи родителя (т.е. записи уровнем выше), номер вложенности, и поле хранящие ID записи первого уровня от которого и растет ветвь дерева. Тогда берешь записи, у которых номер вложенности меньше, и один ID первичной записи и все, если я правильно понял задачу.

Автор: LSD 26.11.2005, 16:24
Не уверен что это сработает в Sybase, но попробуй так:
Вначале выполняешь:
Код
INSERT INTO article (id_art, parentid, isfolder, name)
SELECT id_art_t , parentid_t, isfolder_t, name_t FROM new_sales article_t
WHERE parentid_t is null

затем
Код
INSERT INTO article (id_art, parentid, isfolder, name)
SELECT id_art_t , parentid_t, isfolder_t, name_t FROM new_sales article_t
WHERE parentid_t is (SELECT id_art FROM article)

до тех пор пока количество вставленных строк не станет 0.

Или отключить на время FOREIGN KEY, выполнить
Код
INSERT INTO article (id_art, parentid, isfolder, name)
SELECT id_art_t , parentid_t, isfolder_t, name_t FROM new_sales article_t

а затем снова его включить.

Автор: x404 27.11.2005, 01:02
Я уже чуток все по другому за сегодня сделал: отказался я от справочника, но добавил еще одно поле - "ЗАМОРОЗКА". т.е. у меня для всех предприятий теперь будут присутствовать одни и теже статьи, а вот за работоспособность каждой конкретной статьи будет отвечать эта самая "заморозка",т.е. если статья заморожена, то ее для данного предприятия и нет. Спасибо тем кто откликнулся. Задачка не из простых все таки. А вот насчет номера вложенности в случае копирования статьи это, как мне кажется, абсолютно верно!Это и есть та самая зацепка, которой мне не хватало!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)