Автор | Сообщение |
|
| |
Пост N: 1162
Зарегистрирован: 20.02.11
|
|
Отправлено: 17.01.18 13:55. Заголовок: Есть кто с SQL хорошо дружит
Никак не могу придумать как запросом решить задачку: Есть две таблицы Т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
[только новые]
|
|
|
| |
Пост N: 1163
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.01.18 18:22. Заголовок: Haz пишет: Никак не..
Haz пишет: цитата: | Никак не могу придумать как запросом решить задачку: |
| Тема закрыта. Все же придумал. Все затевалось ради исключения лишнего трафика между клиентом и сервером. В итоге несколько минут на клиенте, стали несколькими секундами на севере. Ps. Сторед процедуру под частный случай писать не хотелось.
|
|
|
|
| |
Пост N: 6703
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.01.18 19:02. Заголовок: Haz пишет: Все же п..
Haz пишет: Ежели решение не очень длинное , то хотелось бы увидеть увидеть его в этой теме
|
|
|
|
| |
Пост N: 1164
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.01.18 19:52. Заголовок: Dima пишет: Ежели р..
Dima пишет: цитата: | Ежели решение ...... увидеть его в этой теме |
| Дим, в понедельник. Правда пришлось добавить сервисное поле в базу. И еще, все соответственно под синтаксис SQL от ADS
|
|
|
|
| |
Пост N: 6704
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.01.18 20:48. Заголовок: Haz пишет: Дим, в п..
Haz пишет: Ждём понедельника тогда !
|
|
|
|
| |
Пост N: 1165
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.01.18 13:22. Заголовок: Dima пишет: Ждём по..
Dima пишет: Где то так. Пришлось добавить поле ID_SAV 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; Поскольку у меня в каждой записи из Т1 соответствует несколько тысяч в Т2 и таких подчиненных таблиц штук 10, традиционным способом ( через dbAppend() ) приходилось на клиента тащить почти все с сервера. Теперь с помощью SQL скрипта все это вертится сугубо на сервере. Мой французский SQL еще далек от совершенства, но работает же
|
|
|
|