Форум » Для флейма » Есть кто с SQL хорошо дружит » Ответить

Есть кто с SQL хорошо дружит

Haz: Никак не могу придумать как запросом решить задачку: Есть две таблицы Т1 и подчиненная Т2 ( связь по T1->ID и T2->ID_T1 т.е. при смене указателя Т1 , автоматом фильтруется Т2 на записи где Т2->ID_T1 == Т1->ID структура Т1 : ID - id текущей записи A1 - поле данных 1 A2 - поле данных 2 A3 - поле данных 3 структура Т2 : ID - id текущей записи ID_Т1 - id записи из Т1 B1 - поле данных 1 B2 - поле данных 2 B3 - поле данных 3 Нужно в Т1 скопировать запись, ей автоматом присвоится уникальный ID в Т2 скопировать все записи с ID_T1 равной ID из Т1 (ID которую копировали) и заменить во всех скопированных в Т2->ID_T1 на новое присвоенное T1->ID как это делать через dbAppend() , FieldGet() и FieldPut() понятно. а можно ли это сделать одним SQL запросом ?

Ответов - 5

Haz: Haz пишет: Никак не могу придумать как запросом решить задачку: Тема закрыта. Все же придумал. Все затевалось ради исключения лишнего трафика между клиентом и сервером. В итоге несколько минут на клиенте, стали несколькими секундами на севере. Ps. Сторед процедуру под частный случай писать не хотелось.

Dima: Haz пишет: Все же придумал. Ежели решение не очень длинное , то хотелось бы увидеть увидеть его в этой теме

Haz: Dima пишет: Ежели решение ...... увидеть его в этой теме Дим, в понедельник. Правда пришлось добавить сервисное поле в базу. И еще, все соответственно под синтаксис SQL от ADS


Dima: Haz пишет: Дим, в понедельник. Ждём понедельника тогда !

Haz: Dima пишет: Ждём понедельника тогда Где то так. Пришлось добавить поле ID_SAV [pre2] DECLARE C1 CURSOR AS SELECT * FROM T1; // Объявили курсор по таблице DECLARE C2 CURSOR OPEN C1; // Открыть курсор WHILE FETCH C1 DO // По всему курсору в цикле INSERT INTO T1 ( A1, A2, A3 , ID_SAV) VALUES ( C1.A1, C1.A2, C1.A3 , C1.ID ) ; // добавить строку и заполнить ее из курсора , сохранив родительский ID OPEN C2 AS SELECT * FROM T2 WHERE ID_T1 = C1.ID ; // открыть курсор подчиненной таблицы Т2 WHILE FETCH C2 DO // скопировать в цикле все строки , подменив на новый ID из Т1 INSERT INTO T2 ( B1, B2, B3 , ID_T1) VALUES ( C2.B1, C2.B2, C2.B3 , SELECT ID FROM T1 WHERE ID_SAV = C1.ID ) END WHILE; CLOSE C2; END WHILE; CLOSE C1; [/pre2] Поскольку у меня в каждой записи из Т1 соответствует несколько тысяч в Т2 и таких подчиненных таблиц штук 10, традиционным способом ( через dbAppend() ) приходилось на клиента тащить почти все с сервера. Теперь с помощью SQL скрипта все это вертится сугубо на сервере. Мой французский SQL еще далек от совершенства, но работает же



полная версия страницы