powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скопировать записи деревянной таблицы
12 сообщений из 12, страница 1 из 1
Скопировать записи деревянной таблицы
    #38415735
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, описывающая дерево:
kod char(10)
user char(6)
soder char(50)
parent char(6)

Требуется скопировать записи where user='xxxxxx' для user='yyyyyy', при этом поле kod д,б, уникально в нашем случае инкремент и, соответственно, обработано поле parent.

На fox'е это не проблема. А как сделать на SQL'е?
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416462
glamis,

Ничего не понял из написанного... Что в parent встает? Если значение kod, то почему у них разная размерность (у kod - char(10), у parent - char(6))? И почему для автоинкремента тип поля char? Оно же целое должно быть...

А предложение у меня такое: перенести записи "As is" во временную таблицу, откорректировать там ссылки (т.е. поле parent) от 1 (то есть первая запись во временной таблице будет иметь новый код = 1) и залить в целевую таблицу с учетом корректировок....
Одним SQL-запросом это не сделать... Здесь надо писать процедуру/функцию на чем-то типа T-SQL или PL/SQL (в зависимости от сервера БД)
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416516
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кий,

пардон, конечно parent C(10).
Автоинкремент - в данном случае значит, что каждый следующий код на 1 больше предыдущего, просто для удобства индексирования в свое время было принято решение таким поля давать тип Char. Поэтому значения поля код: '0000000001','0000000002',...
Проблема на самом деле одна: как в конструкции

Insert into file1 ... Select ... from file1 where user = 'xxxxxx'

получить правильные значения поля kod.
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416576
glamis,
так и не понятно, что именно у тебя не получается. Тебе нужно для определённого user выбрать всех его потомков (ну или определённых) или что именно?
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416636
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирТК,

мне нужно выбрать записи для user='xxxx' и записать их с user='yyyy'. При этом проблема - сформировать правильные коды новых записей. все остальное - замена parent'ов - дело десятое.
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416899
glamis,
т.е. тебе грубо говоря нужно создать копию узла со всеми его подузлами (под узлом я понимаю конкретного юзера с его уникальным кодом) и перебить имя, его код (он появится автоматом как автоинкрементный) и новый код нового родителя (он же) во всех полях parent подузлов первого уровня. Я правильно понял?
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38416979
glamis
мне нужно выбрать записи для user='xxxx' и записать их с user='yyyy'. При этом проблема - сформировать правильные коды новых записей. все остальное - замена parent'ов - дело десятое.

Если я правильно понял, то как раз наоборот: правильные коды новых записей появятся сами собой, а вот с заменой parent в одном запросе будут бооольшие проблемы
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38417948
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирТК,

есть записи:
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
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38418089
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glamisНа fox'е это не проблема. А как сделать на SQL'е?
А на SQL`е это проблема. Почитай как выкручиваются на SQLе. Явно им возможностей фокса не хватает. Не заточен SQL на такие задачи.
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38418109
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TglamisНа fox'е это не проблема. А как сделать на SQL'е?
А на SQL`е это проблема. Почитай как выкручиваются на SQLе. Явно им возможностей фокса не хватает. Не заточен SQL на такие задачи.
Если не ошибаюсь, то начиная с версии MS SQL 2005 возможны рекурсивные запросы (CTE). Правда, справка по 2008, но, кажется, в 2005 это уже было

Рекурсивные запросы, использующие обобщенные табличные выражения

Пример на этом сайте SQL 2005 - Как выбрать дерево со всеми потомками, начиная с заданной parentID?
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38418143
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для копирования ветки дерева не достаточно просто выбрать. Надо еще вставить, меняя ParentID в соответствии с новыми ID добавленных узлов. Насколько я знаю CTE такое не может сделать.
...
Рейтинг: 0 / 0
Скопировать записи деревянной таблицы
    #38418464
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут поколдовал и вроде что-то получилось. Добавил комментарии и привожу реальное решение на реальных таблицах:

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'а. И вроде проще тех, что прописаны в примерах.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скопировать записи деревянной таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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