Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление массы записей, игнорируя уже существующие / 18 сообщений из 18, страница 1 из 1
12.08.2004, 11:02:09
    #32646062
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Пешу на Builder, ADO, Access 2000
Надо вставить в таблицу записи из другой таблицы.
При совпадении индексных полей аццесс естественно выдаёт ошибку.
Таким образом если в двух таблице есть хоть одна запись с одинаковым индексным полем, то при массовом копировании записей с помощью INSERT INTO .. SELECT .., ниодна запись не будет скопирована.
Было б круто если б аццесс всётаки копировал записи которых нет, а которые уже есть не перезаписовал.(не выдвал б ошибку мол уникальность индексов и т.д.)
Главное дело, когда запрос запускаеш на самом аццессе, то аццесс говорит мол будет добавлено столько записей, не будет добавлено столько то записей потомучто индексы и всё работает пучком.
Подскажите плизззз.
...
Рейтинг: 0 / 0
12.08.2004, 11:17:25
    #32646098
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
А что мешает добавлять только те записи, которых нет?

insert ... where ... not in ...
...
Рейтинг: 0 / 0
12.08.2004, 11:55:33
    #32646211
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
я уже сделал запрос insert ... where ... not in ... , но он слишком медленно работает. Вот он:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
INSERT INTO TimesOfAll
SELECT TimesOfDays1.DT, TimesOfDays1.Winter
FROM
(
 SELECT DateValue(:Date1)+TimeValue([TimesOfDays].[DT]) AS DT, [TimesOfDays].[Winter] AS Winter
 FROM TimesOfDays
 WHERE DayType = :DayType
 AND TimeValue(TimesOfDays.DT)>=TimeValue(:DT1)
 AND TimeValue(TimesOfDays.DT)<=TimeValue(:DT2)
)
AS
 TimesOfDays1
LEFT JOIN
(
 SELECT TimesOfAll.DT
 FROM TimesOfAll
 WHERE DateValue([TimesOfAll].[DT]) = DateValue(:Date2)
)
AS
 TimesOfAll1
ON
 TimeValue([TimesOfDays1].[DT])=TimeValue([TimesOfAll1].[DT])
WHERE
 TimesOfAll1.DT IS NULL;
Делов в том что этот запрос должен выполняться в цыкле.
...
Рейтинг: 0 / 0
12.08.2004, 12:03:57
    #32646237
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Зачем тебе милчеловек JOIN здесь???
Так, вроде, проще.

Код: plaintext
1.
2.
3.
INSERT INTO TBL1 
SELECT f1,f2,f3 FROM TBL2 t2
WHERE (....) 
  AND not exists (SELECT  1  FROM TBL1 t1 WHERE t1.ID = t2.ID)
где ID - ключевое поле
...
Рейтинг: 0 / 0
12.08.2004, 13:08:25
    #32646496
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
BelyЗачем тебе милчеловек JOIN здесь???
Так, вроде, проще.

Код: plaintext
1.
2.
3.
INSERT INTO TBL1 
SELECT f1,f2,f3 FROM TBL2 t2
WHERE (....) 
  AND not exists (SELECT  1  FROM TBL1 t1 WHERE t1.ID = t2.ID)
где ID - ключевое поле

хм... щас попробую
...
Рейтинг: 0 / 0
12.08.2004, 13:18:38
    #32646540
Shuhard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
автор
Главное дело, когда запрос запускаеш на самом аццессе, то аццесс говорит мол будет добавлено столько записей, не будет добавлено столько то записей потомучто индексы и всё работает пучком.

Рецепт пучка:
/topic/110599&hl=BULK
...
Рейтинг: 0 / 0
12.08.2004, 13:40:07
    #32646606
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
BelyЗачем тебе милчеловек JOIN здесь???
Так, вроде, проще.

Код: plaintext
1.
2.
3.
INSERT INTO TBL1 
SELECT f1,f2,f3 FROM TBL2 t2
WHERE (....) 
  AND not exists (SELECT  1  FROM TBL1 t1 WHERE t1.ID = t2.ID)
где ID - ключевое поле
Может так и проще, но JOIN-ом гораздо быстрее!
...
Рейтинг: 0 / 0
12.08.2004, 13:46:08
    #32646618
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Shuhard автор
Главное дело, когда запрос запускаеш на самом аццессе, то аццесс говорит мол будет добавлено столько записей, не будет добавлено столько то записей потомучто индексы и всё работает пучком.

Рецепт пучка:
/topic/110599&hl=BULK

ОГРОМНОЕ СПАСИБО!
...
Рейтинг: 0 / 0
12.08.2004, 13:48:23
    #32646628
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
STINGOМожет так и проще, но JOIN-ом гораздо быстрее!
Ты бы просто посмотрел как у тебя SELECT работает.
Здается, что дело в нем и скорость из за него плохая.
JOIN может дать очень много лишних данных, и на их хранение будет тратиться много памяти. Отсюда будут тормоза

А сам SELECT можно по другому модифицировать, но скорость работы будет зависеть от конкретных данных.
Пример:
Код: plaintext
1.
2.
3.
SELECT f1, f2, f3 FROM tbl2 t2
WHERE (....)
  AND t2.ID NOT in (SELECT ID FROM tbl1)
...
Рейтинг: 0 / 0
12.08.2004, 13:49:21
    #32646629
Shuhard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Ежели пойдет - выложи пример кода из Builder-а
интересно глянуть на синтаксис.
...
Рейтинг: 0 / 0
12.08.2004, 14:06:13
    #32646672
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Bely: в моём случае JOIN оказался быстрее чем NOT IN. Проверял и засекал.
...
Рейтинг: 0 / 0
12.08.2004, 14:09:29
    #32646686
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
ShuhardЕжели пойдет - выложи пример кода из Builder-а
интересно глянуть на синтаксис.
Не совсем понял какие исходники.
В билдере есть компонент TADOConnection
у него есть параметр ConnectionString
вот его значение:

Код: plaintext
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=urga.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=******;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=1;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
...
Рейтинг: 0 / 0
12.08.2004, 14:11:14
    #32646694
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Код: plaintext
Provider=Microsoft.Jet.OLEDB. 4 . 0 ;User ID=Admin;Data Source=urga.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=STINGO;Jet OLEDB:Engine Type= 5 ;Jet OLEDB:Database Locking Mode= 1 ;[color=red]Jet OLEDB:Global Partial Bulk Ops= 1 [/color];Jet OLEDB:Global Bulk Transactions= 1 ;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False

Так правильнее.
...
Рейтинг: 0 / 0
12.08.2004, 14:12:08
    #32646696
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
авторProvider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=urga.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=STINGO;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=1;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
Ещё правильнее.
...
Рейтинг: 0 / 0
12.08.2004, 14:21:28
    #32646734
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
STINGOBely: в моём случае JOIN оказался быстрее чем NOT IN. Проверял и засекал.

BTW: если не помогает один запрос, то иногда помогают 2 запроса.
А именно:
1)
Код: plaintext
1.
SELECT t2.id as ID FROM tbl2 t2, tbl1 t1 
WHERE t1.ID = t2.ID
2) Все полученные значения (совпадения ключей) составляем в строку вида: szList = "1,5,7,13"
3) Составляем запрос на добавление, используя фиксированный список:
Код: plaintext
1.
2.
"SELECT f1, f2, f3 FROM tbl2 t2 " & _
"WHERE (....) " & _
"  AND t2.ID not IN (" & szList & ")"

PS: если список с совпадениями получается слишком длинный - добавить условие отбора в запрос (1).
Оптимизация запросов - дело творческое...
...
Рейтинг: 0 / 0
12.08.2004, 14:28:51
    #32646760
STINGO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Всё равно JOIN-ны круче
...
Рейтинг: 0 / 0
12.08.2004, 14:34:07
    #32646784
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
STINGOВсё равно JOIN-ны круче
Что у тебя за данные такие, что JOIN-ы работают быстрее? :-\
Счастливец просто... Первый раз такого вижу.
...
Рейтинг: 0 / 0
12.08.2004, 15:01:14
    #32646895
Shuhard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление массы записей, игнорируя уже существующие
Спасибо - понял!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление массы записей, игнорируя уже существующие / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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