Имя: Пароль:
1C
 
Замена строки в таблице MSSQL на ссылки из другой таблицы
0 Midaw
 
07.09.10
13:10
Есть спецы по скулю? можете накидать процедурку.

есть таблица1 (регистр) со значением1 (строка) и значением2 (ссылка).
есть таблица2 (справочник) со значением3 (ссылка) и значением4 (строка).

нужно используя значение1 найти в таблице2 соответствия значению4 и вместо значение2 (таблица1) подставить значение3 (таблицы2).

не могу даже представить как такое реализовать. явно должны быть циклы... самое главное таблица не должна целиком загружаться в память (таблица1 > 40гб).
1 ДенисЧ
 
07.09.10
13:14
update table1
from table2
set field2 = table2.field3
where table1.field1 = table.field4

что-то вроде такого
2 Midaw
 
07.09.10
13:16
(1) а разве 1с-ка рисует схему отношений в mssql? чтоб использовать ".".
3 ДенисЧ
 
07.09.10
13:16
(2) а причём тут схема отношений? Вообще, что это такое? :-)
4 Midaw
 
07.09.10
13:19
(3) всё, сообразил
5 Midaw
 
07.09.10
13:21
"set" это установка конкретного поля в "update" таблице?
6 Midaw
 
07.09.10
13:23
интересно испытаю сегодня завтра...
тут ещё загвоздка. написал программку для заполнения справочника найденными строками из регистра. что то повисло. надо переписывать...
7 ДенисЧ
 
07.09.10
13:24
(5) ага. Прочитай firststeps.ru - там учебничек по скулю есть...
8 dk
 
07.09.10
13:25
и эта, может рано пока в скуль с прямой записью лезть с такими знаниями
9 Midaw
 
07.09.10
13:27
(7) да купил я уже две книжки...
(8) знания вполне достаточные в понятиях sql. ну да tsql ещё поизучать надо...
10 Midaw
 
07.09.10
13:30
тут ещё синтаксис 1с убивает. раньше на access'e писал запросы (много) и нормально. а теперь к "выбрать" в 1с-ке привык и порой долго думаю над каким нибудь "union"... )))
11 Just4Fun
 
07.09.10
13:34
я так делал

 update _Reference23
 set _Fld9593RRef = (select _IDRReF from _Enum379 where _EnumOrder = '0')

Установил значение реквизита по умолчанию (значение перечисления)
sql-запросом выполнилось за 1-2 секунды. средствами 1с наверное и ночи не хватило бы. справочник большой
12 Just4Fun
 
07.09.10
13:39
у тебя наверное еще добавить условие на значения полей
13 Midaw
 
07.09.10
13:52
(12) условие в подзапросе я так понимаю не будет видеть значения из основного запроса.
14 CoolCat
 
07.09.10
13:57
(13)
update table1
set f2 = (select f3 from table2 where f4 = 'строка со значением 1')
15 CoolCat
 
07.09.10
13:58
(13) условие в подзапросе влияет только на подзапрос
16 Midaw
 
07.09.10
14:04
(15) ну короче не подходит. у меня строк со значением1 много...

первый вариант запустил и оно задумалось.
17 Midaw
 
07.09.10
14:07
тут вот что ещё интересно, как оно проиграет пустые ссылки...
18 Just4Fun
 
07.09.10
14:12
(13) в подзапросе выбирается значение (у меня значение перечисления), которое устанавливается
19 Midaw
 
07.09.10
14:14
(18) в твоем случае все прекрасно и красиво. в моем случае значения "строка со значением 1" в количестве 40 Гбайт... )))
20 Midaw
 
07.09.10
14:15
по какому принципу sql работает с таблицами. допустим запустил я обработку таблицы update и тут же запускаю второй запрос выборки 100 строк из той же таблицы. вот второй запрос виснет, как и возможно первый. так вот нельзя ли приоритет выставить второго запроса... и как вообще такие запросы от 1с-ки дружат?!
21 Just4Fun
 
07.09.10
14:17
(20) хороший вопрос :) нужно где то почитать, как работают блокировки
22 Midaw
 
07.09.10
14:18
(20)+ монитор активности показал что второй запрос стоит в ожидании из-за блокировки. как я понимаю всей таблицы... однако!
23 Just4Fun
 
07.09.10
14:19
(19) 40 гигов  размер базы или именно таблицы?
24 Midaw
 
07.09.10
14:20
(23) размер таблицы
25 Just4Fun
 
07.09.10
14:22
Скопируй эти две таблицы в отдельную БД и потренируйся на них.
кстати, такой вопрос, как регистр обрабатывать хочешь? у регистра ведь еще могут быть и вспомиогательные таблицы
26 Midaw
 
07.09.10
14:23
(25) индексы и итоги переформировать проблемы нет. ещё видел таблицу регистрация изменений, но я так понимаю она мне не интересна и наверняка пустая )
27 Midaw
 
07.09.10
14:24
копировать таблицу нафиг не надо, база пробная.
28 Midaw
 
07.09.10
16:08
меньше 2 часов. запрос выполнился... и самое интересное, время выполнение радует )))
29 CoolCat
 
07.09.10
16:43
(0) UPDATE    Table1
   SET поле2 =
   (SELECT     поле3
   FROM  Table2
   WHERE поле4 = Table1.поле1)

если во второй таблице не будет найдено значение  - он в значение2  пиханет НУЛЛ
30 Midaw
 
07.09.10
16:50
(29) попробуем и этот вариант. в книгах чёт подобное видел. посмотрим что будет быстрее )
31 Midaw
 
07.09.10
18:00
(29) запрос отработал за 35 минут. быстрее в 3-4 раза. но есть и косяк. заполнились значения NULL, вместо не заполненных никак в первом варианте запроса.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.