Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Булево вычитание в Аксес / 14 сообщений из 14, страница 1 из 1
12.05.2007, 15:17:54
    #34520959
HuRN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Есть две таблицы с одинаковыми полями, но разными значениями. Необходимо одну из таблиц дополнить недостающими значениями из другой (типа синхронизировать). Использую такой запрос для выбора этих недостающих:
SELECT GoodsTable.Barcode, GoodsTable.Name
FROM GoodsTable WHERE GoodsTable.Barcode NOT IN (SELECT BarcodesTable.Barcode FROM BarcodesTable);

Таблица BarcodesTable имеет почти 20 тысяч записей поэтому видимо запрос обрабатывается невероятноя количество времени. Что примечательно, без предиката NOT (то есть выборка всех совпадающих) запрос обрабатывается весьма быстро, хотя по идее разницы никакой - всё равно просматривать тот же список на 20 тысяч записей. Есть ли какой-то другой способ? Или это баг Ахсекса (использую 2002-й)?

Заранее спасибо.
...
Рейтинг: 0 / 0
12.05.2007, 15:30:28
    #34520969
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Можно переписать запрос так:

SELECT GoodsTable.Barcode, GoodsTable.Name
FROM GoodsTable LEFT JOIN BarcodesTable
ON GoodsTable.Barcode = BarcodesTable.Barcode
WHERE BarcodesTable.Barcode IS NULL

А поля GoodsTable.Barcode и BarcodesTable.Barcode проиндексированы?
...
Рейтинг: 0 / 0
12.05.2007, 15:36:11
    #34520973
ылхет
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
нот исключает исполжование индексов. поэтому может долшэ
...
Рейтинг: 0 / 0
12.05.2007, 15:38:58
    #34520977
HuRN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Я видимо не совсем точно выразился. Мне нужно получить список записей, отсутствующих в таблице BarcodesTable, но присутствующих в GoodsTable. Апри твоём варианте я получаю список записей, где значение поля Barcode null.
...
Рейтинг: 0 / 0
12.05.2007, 15:42:14
    #34520979
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
авторя получаю список записей, где значение поля Barcode null.Нет, это прием в SQL, позволяющий получить записи отсутствующие в другой таблице.
...
Рейтинг: 0 / 0
12.05.2007, 15:44:22
    #34520981
ылхет
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
исполжуй каунт =0
...
Рейтинг: 0 / 0
12.05.2007, 15:48:37
    #34520988
HuRN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
mds_world авторя получаю список записей, где значение поля Barcode null.Нет, это прием в SQL, позволяющий получить записи отсутствующие в другой таблице.
Я попробывал уже этот запрос в Аксесе - получил список записей GoodsTable, где Barcode - пустая строка. Можно про этот приём поподробнее? И что там насчёт каунта, можно тоже поразвёрнутей? Спасибо.
...
Рейтинг: 0 / 0
12.05.2007, 15:54:55
    #34520993
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Попробуйте строку Where в таком виде
Код: plaintext
WHERE (BarcodesTable.Barcode IS NULL) And (GoodsTable.Barcode Is Not Null)
...
Рейтинг: 0 / 0
12.05.2007, 16:00:21
    #34520996
HuRN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Спасибо огромное, mds_world! Это работает! Пойду дринкну за твоё здоровье!
...
Рейтинг: 0 / 0
12.05.2007, 16:06:02
    #34520998
ILL HEAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
добрался до компутера
not - исключает использование индекса по полю которое проверяется (пэтому скорость падает если поле проиндексировано)
самый быстрый способ (независимо от того проиндексировано поле или нет) - это COUNT в подзапросе
модифицированный ваш запрос
Код: plaintext
1.
2.
SELECT GoodsTable.Barcode, GoodsTable.Name
FROM GoodsTable as t2
WHERE (SELECT count(*) FROM BarcodesTable as t1 where t1.Barcode=t2.Barcode)= 0 ;
...
Рейтинг: 0 / 0
12.05.2007, 16:08:14
    #34521001
ILL HEAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
хотя join быстрее %)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
26.05.2017, 15:02:49
    #39460500
HuRN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
Вот я тупой был всего десять лет назад. Через десять лет ещё зайду, мне понравилось.
...
Рейтинг: 0 / 0
26.05.2017, 15:28:47
    #39460517
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
HuRNВот я тупой был всего десять лет назад. Через десять лет ещё зайду, мне понравилось.
...
Рейтинг: 0 / 0
27.05.2017, 08:33:17
    #39460762
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Булево вычитание в Аксес
ILL HEADхотя join быстрее %)

Тоже недавно столкнулся. IN в Access-е жутко тормозит запрос. В MS SQL подобное отработало бы моментально.

Так что если появились тормоза, то выходом может быть лишь перевод на JOIN. В моем случае пришлось данные подзапроса сбрасывать в буферную табличку и уже JOIN с ней, так как требовалось чтобы итоговый запрос был редактируемым.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Булево вычитание в Аксес / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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