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

Откуда:
Сообщений: 10
Добрый вечер, коллеги!
Помогите пожалуйста оптимизировать запрос.

Имеется две таблицы вида:
Таблица1 (описание автоматизированных систем)
sys_name | sys_description
------------------------------------
Система 1 | описание1
Система 2 | описание2
Система 3 | описание3
......................

Таблица2 (история входов в систему)
sys_name | login | datetime
--------------------------------------------------
Система 1 | User1 |18.12.2014
Система 1 | User1 |17.12.2014
Система 1 | User1 |16.12.2014
Система 1 | User2 |17.12.2014
Система 2 | User1 |10.12.2014
Система 3 | User2 |18.12.2014
.......................

В итоге надо получить для каждой системы из таблицы 1 последнюю сессию пользователя (логин и время) из таблицы 2:
sys_name | sys_description | login | datetime
-------------------------------------------------------------
Система 1 | Описание 1 | User1 | 18.12.2014
Система 2 | Описание 2 | User1 | 10.12.2014
Система 3 | Описание 3 | User2 | 18.12.2014

Фантазия подвела, сейчас выбираю запросом:
select sys_name, sys_description, (select top 1 t.login from table2 t where t.sys_name = sys_name order by datetime desc) as login, (select top 1 t.datetime from table2 t where t.sys_name = sys_name order by datetime desc) as datetime from table1

Запрос отрабатывает 8 секунд, при том что в обеих таблицах не больше 100 строк.
Очевидно, что есть какое-то элементарное решение, но глаз настолько замылился, что несколько часов переливаю из пустого в порожнее и не могу понять, как же сделать правильно.

HELP PLEASE!!!
18 дек 14, 18:03    [17018742]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки  [new]
Hamber
Member

Откуда: Москва
Сообщений: 310
Разверните в OUTER APPLY.

select t.sys_name, t.sys_description, t2.login, t2.datetime  from table1 t
OUTER APPLY (SELECT TOP 1 t2.login, t2.datetime from table2 t2
                    where t.sys_name = t2.sys_name
                    order by datetime desc) t2


select t.sys_name, t.sys_description, t2.login, t2.datetime  from table1 t
CROSS APPLY (SELECT TOP 1 t2.login, t2.datetime from table2 t2
                    where t.sys_name = t2.sys_name
                    order by datetime desc) t2
18 дек 14, 18:27    [17018852]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки  [new]
Добрый Э - Эх
Guest
ozzymous
Очевидно, что есть какое-то элементарное решение
элементарных решений есть вагон и маленькая тележка. выбирай на свой вкус и цвет
18 дек 14, 19:35    [17019115]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки  [new]
ozzymous
Member

Откуда:
Сообщений: 10
Огромное спасибо!
К своему стыду, не знал о таком прекрасном операторе, как APPLY.
Время выполнения запроса сократилось до секунды :)
19 дек 14, 14:01    [17022922]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить