Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 оптимизация вложенного запроса select  [new]
Advanced_Guest
Member

Откуда:
Сообщений: 1
Проблема в том, что запрос выполняется долго, как можно оптимизировать? Я новичок в T-SQL.

select цена.цена from цена 
  where цена.код_товара='000001' 
    and цена.период_конец>=(select учёт.дата_прихода 
                           from учёт 
                           where учёт.номер_карточки=(select справочник.номер_карточки from справочник 
                                                       where справочник.номер_партии='1412' and справочник.код_товара='000001'))
    and цена.период_начало<=(select учёт.дата_прихода 
                           from учёт 
                           where учёт.номер_карточки=(select справочник.номер_карточки from справочник 
                                                       where справочник.номер_партии='1412' and справочник.код_товара='000001'));


есть три таблицы: ценник (цена), учёт и картотека товаров (справочник).

Запрос получает номер карточки из справочника через код товара и номер партии, по номеру находит дату прихода, по дате прихода находит цену на товар на эту дату в ценнике.

Для большого количества товаров выполняется очень долго.

Заранее благодарю за любой совет!
1 авг 12, 16:07    [12947383]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация вложенного запроса select  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
У Вас подзапросы никак не связаны с основным запросом, поэтому сделайте выборку дата_прихода в переменную и уже ее используйте в запросе в BETWEEN ... AND ...
1 авг 12, 16:16    [12947460]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация вложенного запроса select  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
select
 c.цена
from
 справочник a join
 учёт b on b.номер_карточки = a.номер_карточки join
 цена c on c.код_товара = a.код_товара and b.дата_прихода between c.период_начало and c.период_конец
where
 a.номер_партии='1412' and a.код_товара='000001';
1 авг 12, 16:41    [12947644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить