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

Откуда:
Сообщений: 2
Добрый день

Есть 2 таблицы

Name
| name_id | Name |

Payment
|payment_id | name_id | date | amount

Я хочу сделать выборку с максимальной датой платежа

select n.name, p.date
from
name n
inner join payment p on p.name_id=n.name_id and p.date in
(select max(date) from payment where name_id=n.name_id)

Можно ли как то более оптимально это записать - для такой простой вещи использовать вложенный запрос как то кажется неоптимальным.
28 апр 18, 10:18    [21376325]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
ramel333,

По опыту скажу EXISTS работает быстрее чем IN
28 апр 18, 10:24    [21376333]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
ramel333,

select n.name, p.date
from
name n
cross apply 
(select max(date) as Max_Date from payment where name_id=n.name_id
Having max(date) = n.date
) p
28 апр 18, 10:31    [21376361]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Kopelly,

Ошибочка:

select n.*
from
name n
cross apply 
(select max(date) as Max_Date from payment where name_id=n.name_id
Having max(date) = n.date
) p
28 апр 18, 10:32    [21376362]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Kopelly,
Опять ошибочка:

select *
from
name n
cross apply 
(select max(date) as Max_Date from payment where name_id=n.name_id
Having max(date) = n.date
) p
28 апр 18, 10:33    [21376365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
rly?
SELECT
  n.[name],
  [max_date] = MAX( p.[date] )
FROM
  [name] n
  INNER JOIN [payment] p on (
        p.[name_id] = n.[name_id] )
28 апр 18, 11:25    [21376541]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
GROUP BY
  n.[name]
28 апр 18, 11:26    [21376544]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
select *
from
name n
outer apply 
(select top 1 * from payment where name_id=n.name_id
Order by date desc
) p
28 апр 18, 11:36    [21376573]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20207
Kopelly, зачем Вы мучаетесь, пытаясь получить всю запись о платеже, когда автору, по его словам, нужна только последняя дата?
28 апр 18, 11:38    [21376577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
ramel333,

ну баян же... или неустаревающая классика?
28 апр 18, 11:55    [21376633]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Щукина Анна
ramel333,
ну баян же... или неустаревающая классика?

У него задача проще, и решается она простым MAX( ... ) GROUP BY
28 апр 18, 12:00    [21376647]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Akina,

Хочу чтобы у студента в процессе выбора хоть что-то в голове осталось...
28 апр 18, 12:01    [21376651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
ramel333
Member

Откуда:
Сообщений: 2
Уточню запрос, скорее нужна сумма за последнюю дату

select n.name, p.amount
from
name n
inner join payment p on p.name_id=n.name_id and p.date in
(select max(date) from payment where name_id=n.name_id)
28 апр 18, 12:26    [21376768]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ramel333
Уточню запрос, скорее нужна сумма за последнюю дату

Вот и надо было задавать соответствующий вопрос.
Ответ уже дали 21376633, а там аж целых 7+1 вариантов решения.
28 апр 18, 12:28    [21376782]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
humble
Member

Откуда:
Сообщений: 1
Хоть так хоть так без индекса сканирование будет.
28 апр 18, 18:42    [21377864]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить