Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Варианты  [new]
Guest SQL
Guest
declare @T table (idT int, T nvarchar(10))
declare @R table (IdR int, IdT int, R nvarchar(10), P  int)

Insert into @T 
select 1, 'a'
union 
select 2, 'b'
union
select 3, 'c'

insert into @R
select 1, 1, 'aa', 1 
union
select 2, 1, 'ab', 2
union
select 3, 2, 'bb', 1
union
select 4, 3, 'cc', 1

На выходе:
idT T IdR R
3 c 4 cc
2 b 3 bb
1 a 2 ab


Есть решение без подзапроса?

select T.idT, T, R.IdR, R.R
from 
@t T inner join @R r on t.idT=R.IdT
where r.P=(select max(r1.p) from @R r1 where r1.IdT=T.idT)
29 мар 05, 16:18    [1423824]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
ChA
Member

Откуда: Москва
Сообщений: 11136
А в чем проблема ? Неэстетично выглядит, что ли ?
А вот так
select T.idT, T, R.IdR, R.R
from (
  select IdT, max(p) AS p
  from @R
  GROUP BY IdT
) r1
INNER JOIN @t T ON (T.idT = r1.IdT)
inner join @R r on (R.IdT = t.idT AND r.P = r1.p)
устроит ?
29 мар 05, 16:34    [1423908]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
Guest SQL
Guest
Спасибо попробую.
в реале подзапрос слишком здоровый.
29 мар 05, 16:46    [1423977]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а если индекс @R(IdR,P)
и запрос от ChA переписать так
select T.idT, T, R.IdR, R.R
from (
  select distinct IdT, 
  (select top 1 P from @R r1 where r1.IdR=IdR order by P desc) AS p
  from @R
  GROUP BY IdT
) r1
INNER JOIN @t T ON (T.idT = r1.IdT)
inner join @R r on (R.IdT = t.idT AND r.P = r1.p)
ИМХО будет шустрее, если для одного IdR много P
29 мар 05, 17:10    [1424081]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
ChA
Member

Откуда: Москва
Сообщений: 11136
Smirnov Anton
ИМХО будет шустрее, если для одного IdR много P

Сильно сомневаюсь, что 3 слияния с агрегированием будут быстрее 2 слияний с агрегированием, особенно при правильной индексации. Кроме того, почти наверняка IdR - ключ таблицы @R, тогда в чем смысл индекса @R(IdR,P). Последнее - Вы запрос свой проверяли ?
29 мар 05, 17:20    [1424121]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
1)запрос такой(до этого не проверял)
select T.idT, T, R.IdR
from (
  select distinct r2.IdT, 
  (select top 1 P from R r1 where r1.IdT=r2.IdT order by P desc) AS p
  from R r2
) r1
INNER JOIN T ON (T.idT = r1.IdT)
inner join R on (R.IdT = t.idT AND r.P = r1.p)
2)я имет в видe индекс R(IdT,P)
3) заколебался тестировать на разных данных с разными индексами -
не мог ощутить разницы в быстродействии, хотя для вашего запроса удивительно красивый план получается :)
29 мар 05, 17:52    [1424241]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
Guest SQL
Guest
автор

до этого не проверял

и опять опечатки, однако идею я вашу понял, спасибо.
29 мар 05, 18:03    [1424289]     Ответить | Цитировать Сообщить модератору
 Re: Варианты  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
Guest SQL
автор

до этого не проверял

и опять опечатки, однако идею я вашу понял, спасибо.

да это не опечатки, я просто не переменные таблицы использовал
29 мар 05, 18:18    [1424347]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить