Замена строки в таблице MSSQL на ссылки из другой таблицы #503439


#0 by Midaw
Есть спецы по скулю? можете накидать процедурку. есть таблица1 (регистр) со значением1 (строка) и значением2 (ссылка). есть таблица2 (справочник) со значением3 (ссылка) и значением4 (строка). нужно используя значение1 найти в таблице2 соответствия значению4 и вместо значение2 (таблица1) подставить значение3 (таблицы2). не могу даже представить как такое реализовать. явно должны быть циклы... самое главное таблица не должна целиком загружаться в память (таблица1 > 40гб).
#1 by ДенисЧ
что-то вроде такого
#2 by Midaw
а разве 1с-ка рисует схему отношений в mssql? чтоб использовать ".".
#3 by ДенисЧ
а причём тут схема отношений? Вообще, что это такое? :-)
#4 by Midaw
всё, сообразил
#5 by Midaw
"set" это установка конкретного поля в "update" таблице?
#6 by Midaw
интересно испытаю сегодня завтра... тут ещё загвоздка. написал программку для заполнения справочника найденными строками из регистра. что то повисло. надо переписывать...
#7 by ДенисЧ
ага. Прочитай firststeps.ru - там учебничек по скулю есть...
#8 by dk
и эта, может рано пока в скуль с прямой записью лезть с такими знаниями
#9 by Midaw
да купил я уже две книжки... знания вполне достаточные в понятиях sql. ну да tsql ещё поизучать надо...
#10 by Midaw
тут ещё синтаксис 1с убивает. раньше на access'e писал запросы (много) и нормально. а теперь к "выбрать" в 1с-ке привык и порой долго думаю над каким нибудь "union"... )))
#11 by Just4Fun
я так делал  update _Reference23  set _Fld9593RRef = (select _IDRReF from _Enum379 where _EnumOrder = '0') Установил значение реквизита по умолчанию (значение перечисления) sql-запросом выполнилось за 1-2 секунды. средствами 1с наверное и ночи не хватило бы. справочник большой
#12 by Just4Fun
у тебя наверное еще добавить условие на значения полей
#13 by Midaw
условие в подзапросе я так понимаю не будет видеть значения из основного запроса.
#14 by CoolCat
update table1 set f2 = (select f3 from table2 where f4 = 'строка со значением 1')
#15 by CoolCat
условие в подзапросе влияет только на подзапрос
#16 by Midaw
ну короче не подходит. у меня строк со значением1 много... первый вариант запустил и оно задумалось.
#17 by Midaw
тут вот что ещё интересно, как оно проиграет пустые ссылки...
#18 by Just4Fun
в подзапросе выбирается значение (у меня значение перечисления), которое устанавливается
#19 by Midaw
в твоем случае все прекрасно и красиво. в моем случае значения "строка со значением 1" в количестве 40 Гбайт... )))
#20 by Midaw
по какому принципу sql работает с таблицами. допустим запустил я обработку таблицы update и тут же запускаю второй запрос выборки 100 строк из той же таблицы. вот второй запрос виснет, как и возможно первый. так вот нельзя ли приоритет выставить второго запроса... и как вообще такие запросы от 1с-ки дружат?!
#21 by Just4Fun
хороший вопрос :) нужно где то почитать, как работают блокировки
#22 by Midaw
+ монитор активности показал что второй запрос стоит в ожидании из-за блокировки. как я понимаю всей таблицы... однако!
#23 by Just4Fun
40 гигов  размер базы или именно таблицы?
#24 by Midaw
размер таблицы
#25 by Just4Fun
Скопируй эти две таблицы в отдельную БД и потренируйся на них. кстати, такой вопрос, как регистр обрабатывать хочешь? у регистра ведь еще могут быть и вспомиогательные таблицы
#26 by Midaw
индексы и итоги переформировать проблемы нет. ещё видел таблицу регистрация изменений, но я так понимаю она мне не интересна и наверняка пустая )
#27 by Midaw
копировать таблицу нафиг не надо, база пробная.
#28 by Midaw
меньше 2 часов. запрос выполнился... и самое интересное, время выполнение радует )))
#29 by CoolCat
если во второй таблице не будет найдено значение  - он в значение2  пиханет НУЛЛ
#30 by Midaw
попробуем и этот вариант. в книгах чёт подобное видел. посмотрим что будет быстрее )
#31 by Midaw
запрос отработал за 35 минут. быстрее в 3-4 раза. но есть и косяк. заполнились значения NULL, вместо не заполненных никак в первом варианте запроса.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С