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

insert ... where ... not in ...
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #32646540
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Главное дело, когда запрос запускаеш на самом аццессе, то аццесс говорит мол будет добавлено столько записей, не будет добавлено столько то записей потомучто индексы и всё работает пучком.

Рецепт пучка:
/topic/110599&hl=BULK
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #32646618
STINGO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shuhard автор
Главное дело, когда запрос запускаеш на самом аццессе, то аццесс говорит мол будет добавлено столько записей, не будет добавлено столько то записей потомучто индексы и всё работает пучком.

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

ОГРОМНОЕ СПАСИБО!
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #32646629
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежели пойдет - выложи пример кода из Builder-а
интересно глянуть на синтаксис.
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #32646672
STINGO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely: в моём случае JOIN оказался быстрее чем NOT IN. Проверял и засекал.
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #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
Добавление массы записей, игнорируя уже существующие
    #32646760
STINGO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё равно JOIN-ны круче
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #32646784
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STINGOВсё равно JOIN-ны круче
Что у тебя за данные такие, что JOIN-ы работают быстрее? :-\
Счастливец просто... Первый раз такого вижу.
...
Рейтинг: 0 / 0
Добавление массы записей, игнорируя уже существующие
    #32646895
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо - понял!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление массы записей, игнорируя уже существующие
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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