|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
Есть таблица, описывающая дерево: kod char(10) user char(6) soder char(50) parent char(6) Требуется скопировать записи where user='xxxxxx' для user='yyyyyy', при этом поле kod д,б, уникально в нашем случае инкремент и, соответственно, обработано поле parent. На fox'е это не проблема. А как сделать на SQL'е? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2013, 16:01 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
glamis, Ничего не понял из написанного... Что в parent встает? Если значение kod, то почему у них разная размерность (у kod - char(10), у parent - char(6))? И почему для автоинкремента тип поля char? Оно же целое должно быть... А предложение у меня такое: перенести записи "As is" во временную таблицу, откорректировать там ссылки (т.е. поле parent) от 1 (то есть первая запись во временной таблице будет иметь новый код = 1) и залить в целевую таблицу с учетом корректировок.... Одним SQL-запросом это не сделать... Здесь надо писать процедуру/функцию на чем-то типа T-SQL или PL/SQL (в зависимости от сервера БД) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 10:50 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
Станислав С...кий, пардон, конечно parent C(10). Автоинкремент - в данном случае значит, что каждый следующий код на 1 больше предыдущего, просто для удобства индексирования в свое время было принято решение таким поля давать тип Char. Поэтому значения поля код: '0000000001','0000000002',... Проблема на самом деле одна: как в конструкции Insert into file1 ... Select ... from file1 where user = 'xxxxxx' получить правильные значения поля kod. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:22 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
glamis, так и не понятно, что именно у тебя не получается. Тебе нужно для определённого user выбрать всех его потомков (ну или определённых) или что именно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 11:53 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
ВладимирТК, мне нужно выбрать записи для user='xxxx' и записать их с user='yyyy'. При этом проблема - сформировать правильные коды новых записей. все остальное - замена parent'ов - дело десятое. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 12:24 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
glamis, т.е. тебе грубо говоря нужно создать копию узла со всеми его подузлами (под узлом я понимаю конкретного юзера с его уникальным кодом) и перебить имя, его код (он появится автоматом как автоинкрементный) и новый код нового родителя (он же) во всех полях parent подузлов первого уровня. Я правильно понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 14:43 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
glamis мне нужно выбрать записи для user='xxxx' и записать их с user='yyyy'. При этом проблема - сформировать правильные коды новых записей. все остальное - замена parent'ов - дело десятое. Если я правильно понял, то как раз наоборот: правильные коды новых записей появятся сами собой, а вот с заменой parent в одном запросе будут бооольшие проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 15:36 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
ВладимирТК, есть записи: kod user soder parent 000001 001001 запись 1 000002 001001 запись 1_1 000001 000003 001001 запись 1_2 000001 000004 001001 запись 2 и тд. Надо добавить: 000005 001002 запись 1 000006 001002 запись 1_1 000005 000007 001002 запись 1_2 000005 000008 001002 запись 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 08:43 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
glamisНа fox'е это не проблема. А как сделать на SQL'е? А на SQL`е это проблема. Почитай как выкручиваются на SQLе. Явно им возможностей фокса не хватает. Не заточен SQL на такие задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 15:39 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
Dima TglamisНа fox'е это не проблема. А как сделать на SQL'е? А на SQL`е это проблема. Почитай как выкручиваются на SQLе. Явно им возможностей фокса не хватает. Не заточен SQL на такие задачи. Если не ошибаюсь, то начиная с версии MS SQL 2005 возможны рекурсивные запросы (CTE). Правда, справка по 2008, но, кажется, в 2005 это уже было Рекурсивные запросы, использующие обобщенные табличные выражения Пример на этом сайте SQL 2005 - Как выбрать дерево со всеми потомками, начиная с заданной parentID? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 16:34 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
Для копирования ветки дерева не достаточно просто выбрать. Надо еще вставить, меняя ParentID в соответствии с новыми ID добавленных узлов. Насколько я знаю CTE такое не может сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2013, 17:39 |
|
Скопировать записи деревянной таблицы
|
|||
---|---|---|---|
#18+
Я тут поколдовал и вроде что-то получилось. Добавил комментарии и привожу реальное решение на реальных таблицах: TEXT TO _comm TEXTMERGE NOSHOW PRETEXT 7 /* Получить следующий код пользователя из таблицы пользователей */ DECLARE @maxkod Char(6), @maxcode char(10) SET @maxkod=(SELECT MAX(kod) FROM Users) SET @maxkod=RIGHT('000000'+RTRIM(CAST(CAST(@maxkod as Int)+1 as Char(6))),6) /* Добавим новую запись в таблице пользователей - зафиксируем полученный код */ INSERT INTO Users (kod, naim, parent, password, roles, short, photo, photo_exch, [order], postn, postn2, phone, win_name) SELECT @maxkod, '<<ALLTRIM(Thisform.text1.Value)>>', parent, '', roles, '<<ALLTRIM(Thisform.text2.Value)>>', '', 0, [order], '','', '', '<<ALLTRIM(Thisform.text2.Value)>>') where kod = '<<Thisform.text3.tag>>' /* Скопируем список доступных таблиц */ INSERT INTO User_tab SELECT distinct @maxkod, [table], [t_right] FROM User_tab WHERE [user] = '<<Thisform.text3.tag>>' /* Займемся рабочим местом пользователя Пронумеруем встяавляемые записи (newuid) */ CREATE TABLE #tempKod (uid Int, code Char(10), newuid int identity(1,1)) INSERT INTO #tempkod (uid, code) SELECT sqluid, code FROM user_arm WHERE [user] = '<<Thisform.text3.tag>>' /* Промежуточно сохраним рабочее место пользователя, добавив к нему нашу нумерацию */ Select User_arm.*, #tempkod.newuid, #tempkod.code oldcode, User_arm.parent_cod oldparent into #tempkod2 from User_arm inner join #tempkod on User_arm.sqluid = #tempkod.uid /* получим следующий код в таблице рабочих мест */ SET @maxcode=(SELECT MAX(code) FROM User_arm) SET @maxcode=CAST(right(@maxcode,9) as Int) /* Сформируем новые коды */ Update #tempkod2 set code='A'+right('000000000'+rtrim(cast(@maxcode+newuid as char(9))),9), [user]=@maxkod /* Сформируем новых родителей */ Update #tempkod2 set parent_cod=a.code from (Select code, oldcode from #tempkod2) a where #tempkod2.oldparent = a.oldcode /* Дозапишем полученное в таблицу рабочих мест */ INSERT INTO User_arm (arm_id, [code], naim, obj_kod, obj_param, parent_cod, tree_order, [user]) SELECT arm_id, [code], naim, obj_kod, obj_param, parent_cod, tree_order, [user] from #tempkod2 /* Зачистимся и вернем сформированнон рабочее место */ DROP TABLE #tempkod drop table #tempkod2 Select * from User_arm WHERE [user] = @maxkod ENDTEXT Решение для mssql, но в принципе с миню изменениями пойдет и для fox'а. И вроде проще тех, что прописаны в примерах. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2013, 08:50 |
|
|
start [/forum/topic.php?fid=41&msg=38418464&tid=1582888]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
600ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 704ms |
0 / 0 |