Запрос на основе таблицы

Z80A

Доброе время суток !Помогите решить задачу :Есть две таблицы : "Товар" и "Запрос".Таблица "Товар" имеет 3 столбца : "Производитель", "Артикул", "Наличие" - это список товаров на складе (~ 1.5 млн. записей)Таблица "Запрос" имеет 2 столбца : "Производитель" и "Артикул" (5-30 записей)Нужно из таблицы "Товар" вытащить записи, которые соответствуют полям "Производитель" и "Артикул" таблицы "Запрос" (т.е. отбор по двум полям) и результат записать в третью (временную таблицу).Пока в голову пришло следующее: 1) Определить кол-во записей в таблице "Запрос". 2) С помощью цикла, перебирая данные из таблицы "Запрос", вытаскивать записи из таблицы "Товар".Может есть другой, более правильный способ ?
18 ответов

Z80A

Если я правильно понял , то попробуйте соединить эти две таблицы по двум полям, и в запросе манипулируйте Left Join,Right Join . За достоверность информации ответственности не несу .


Z80A

Z80A,1.таблицы не должны иметь одинаковых полей (производитель, артикул)-один из основных принципов "базостроения"2.зачем третья (временная таблица-эти данные всегда можно получить запросом,отчетом,сделать источником данных формы или применить фильтр на существующей форме)Возникают смутные сомнения насчет структуры БД


Z80A

Спасибо откликнувшимся. Все решилось довольно просто :SELECT tblТовар.Производитель, tblТовар.АртикулFROM tblТовар, tblЗапросWHERE (((tblТовар.Производитель)=tblЗапрос.[Производитель]) And ((tblТовар.Артикул)=tblЗапрос.[Артикул]));


Z80A

Спасибо откликнувшимся. Все решилось довольно просто :SELECT tblТовар.Производитель, tblТовар.АртикулFROM tblТовар, tblЗапросWHERE (((tblТовар.Производитель)=tblЗапрос.[Производитель]) And ((tblТовар.Артикул)=tblЗапрос.[Артикул]));
Плоховатое решение. Иннер джоин был бы лучше. Спасает ситуацию то, что он настолько прост, что любой оптимизатор должен переварить его так же как с джоином.


Z80A

Программист-Любитель, спасибо, что откликнулся, не мог бы ты привести пример кода для этой ситуации, я с этими JOIN-INNER-OUTER-LEFT-RIGHT вообще не отдупляю. Читал Гетца по этому вопросу, но что-то как-то.....


Z80A

Плоховатое решение. Иннер джоин был бы лучше. Спасает ситуацию то, что он настолько прост, что любой оптимизатор должен переварить его так же как с джоином.
Это же Аксесс - оптимизатор (а если точнее - планопостроитель, это не MS SQL, нет в нём оптимизатора) развернёт JOIN во WHERE. Обе формы абсолютно эквивалентны.


Z80A

Более того - сталкивался с практически аналогичной задачей, и выяснилось, что даже составные первичные ключи по двум полям, по которым таблицы связываются, не привели к увеличению скорости обработки...


Z80A

Specifying the join conditions in the FROM clause helps separate them from any other search conditions that may be specified in a WHERE clause, and is the recommended method for specifying joins


Z80A

В итоге - стоит ли искать решение с JOIN или остановиться на том, что есть, в контексте данной задачи ?


Z80A

Z80A, обязательно. Хотя бы в порядке самообразования. Причём не столько найти, сколько понять.


Z80A

Z80A, обязательно. Хотя бы в порядке самообразования. Причём не столько найти, сколько понять.
Ок. Спасибо. Главное, чтобы самообразование не превратилось в самобичевание в конечном итоге ))


Z80A

Кстати, если поделитесь ссылкой на данный материал, для тех, кто в танке, буду очень признателен.


Z80A

Кстати, если поделитесь ссылкой на данный материал, для тех, кто в танке, буду очень признателен.
google


Z80A

Получилось таким способом :SELECT tblТовар.F1, tblТовар.F2FROM tblТовар INNER JOIN tblЗапрос ON tblТовар.F1 = tblЗапрос.F1 And tblТовар.F2 = tblЗапрос.F2Результат тот же, скорость выполнения, на мой взгляд, одинаковая.


Z80A

Результат тот же, скорость выполнения, на мой взгляд, одинаковая.
А ты планы выполнения посмотри - они тоже одинаковые.


Z80A

А ты планы выполнения посмотри - они тоже одинаковые.
Вы об этом ?[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug] создать строковый параметр JETSHOWPLAN и присвоить ему значение ON, то это заставит Access (после перезапуска) создавать текстовый файл showplan.out в папке Мои документы, в котором будет содержаться план выполнения запросов.Я пока чайник в этих вещах.


Z80A

Вы об этом ?
Угу
Я пока чайник в этих вещах.
Со временем это пройдёт...


Z80A

УгуСо временем это пройдёт...
Благодарю за помощь.