Как улучшить этот SQL-запрос Access - PullRequest
1 голос
/ 07 ноября 2011

У меня есть запрос, который делает то, что он должен, но мне интересно, можно ли сделать его более эффективным без , разделив его на 2 отдельных запроса.

SELECT [Full UO Code] FROM HPP_MD
WHERE LEFT([Full UO Code],5) In 
(SELECT IIF([Building]="Site" AND 
([Function Name_Usage Type]<>"Property" AND 
[Function Name_Usage Type]<>"Undeveloped Land"),[Business Entity],"") As Test 
FROM HPP_MD);

Это простой запрос Access, с которым я играю. Легко получить требуемые результаты, если я выполню подзапрос как запрос 'create table', а затем выполню второй запрос к этой новой таблице, чтобы получить необходимые данные.

Я из любопытства создал запрос / подзапрос, чтобы посмотреть, как он работает, но он довольно медленный, и мне интересно, можно ли что-нибудь сделать для повышения эффективности. Является ли создание временного столбца правильной вещью здесь? Я не мог придумать другого способа сделать это.

Есть мысли? Я знаю, что заголовки столбцов довольно зловещие, но это была просто быстрая таблица, которую я импортировал в Access, и в этом случае меня нельзя было поменять, чтобы изменить имена.

1 Ответ

2 голосов
/ 07 ноября 2011

Похоже, что IN всегда терпит неудачу, если большое AND выходит ложным.Предполагается, что [Full UO Code] никогда не является пустой строкой, что может быть неправильно.Но если я прав, вы можете избавиться от IIF, который в принципе не может быть оптимизирован, до WHERE

/* ... IN */
(SELECT [Business Entity] FROM HPP_MD 
 WHERE 
 [Building]="Site" AND 
   ([Function Name_Usage Type]<>"Property" AND 
   [Function Name_Usage Type]<>"Undeveloped Land")

.переписать подзапрос в самостоятельное соединение.Это может или не может быть быстрее.В любом случае, [Building] и [Function Name_Usage Type] должны быть проиндексированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...