Как лучше написать этот запрос? - PullRequest
0 голосов
/ 14 июля 2009

В моей базе данных есть таблица с записями 1.1MM. У меня есть другая таблица в моей базе данных, которая содержит около 2000 записей под именем поля «ИМЯ». То, что я хочу сделать, это выполнить поиск из таблицы 1 с использованием таблицы меньшего размера и извлечь записи, где они соответствуют записи меньших таблиц. Например, таблица 1 имеет имя, фамилию. У таблицы 2 есть Имя, я хочу найти каждую запись в Таблице 1, которая содержит любое из Имен таблицы 2 в поле первого имени или во втором имени. Я пытался просто сделать запрос доступа, но мой компьютер просто завис. Любые мысли будут оценены.

Ответы [ 5 ]

2 голосов
/ 14 июля 2009

рассматривали ли вы следующее:

Select Table1.FirstName, Table1.LastName 
from Table1 
where EXISTS(Select * from Table2 WHERE Name = Table1.FirstName) 
   or EXISTS(Select * from Table2 WHERE Name = Table1.LastName)

Ранее я обнаружил, что на больших таблицах это может работать лучше, чем внутреннее соединение.

1 голос
/ 14 июля 2009

Обязательно создайте индексы для Table1.first_name, Table1.last_name и Table2.name. Они значительно ускорят ваш запрос.

Редактировать: Microsoft Access 2007 см. CREATE INDEX .

0 голосов
/ 14 июля 2009

Я согласен с astander . Исходя из моего опыта, использование EXIST вместо IN намного быстрее.

0 голосов
/ 14 июля 2009

Должно быть что-то вроде этого,

Select Table1.FirstName, Table1.LastName 
from Table1 
where Table1.FirstName IN (Select Distinct Name from Table2) 
   or Table1.LastName  IN (Select Distinct Name from Table2)

И есть несколько других способов выполнить этот же запрос, я бы посоветовал вам посмотреть план выполнения каждого из этих запросов, чтобы выяснить, какой из них самый быстрый. Кроме того, создание индексов для столбца, который используется в условии «где», также ускорит запрос.

0 голосов
/ 14 июля 2009

См. Выше предыдущие заметки об индексах, но я думаю, из вашего описания, вы хотите что-то вроде:

select table1.* from table1 
  inner join 
    table2 on (table1.first_name = table2.name OR table1.last_name = table2.name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...