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

Откуда: урал
Сообщений: 2850
DECLARE @tab1 AS TABLE(id INT PRIMARY KEY, personName VARCHAR(50))
DECLARE @tab2 AS TABLE(personName VARCHAR(50) PRIMARY KEY)


INSERT INTO @tab2 VALUES('John')
INSERT INTO @tab2 VALUES('David')

INSERT INTO @tab1 VALUEs(1, 'John')
INSERT INTO @tab1 VALUEs(2, 'John')
INSERT INTO @tab1 VALUEs(3, 'John')
INSERT INTO @tab1 VALUEs(4, 'David')
INSERT INTO @tab1 VALUEs(5, 'David')


SELECT *
FROM   @tab1 a
JOIN @tab2 b
ON  a.personName = b.personName
AND a.id = (
  SELECT MAX(ID)
  FROM   @tab1 x
  WHERE  x.personName = b.personName
           )


можно-ли как-то более эффективно производить подобные джойны чем так? т.к. в случае множества записей получается много подзапросов
14 май 12, 11:08    [12548530]     Ответить | Цитировать Сообщить модератору
 Re: Как наиболее эффективно заджойнить на макс. значение?  [new]
Добрый Э - Эх
Guest
Тынц: выбирай на свой вкус и цвет в соответствие со своими данными и возможностями сервера
14 май 12, 11:17    [12548604]     Ответить | Цитировать Сообщить модератору
 Re: Как наиболее эффективно заджойнить на макс. значение?  [new]
aleks2
Guest
Ежели вам именно "гопом", т.е. фсе, тады так

SELECT *
FROM   @tab1 a
JOIN @tab2 b
ON  a.personName = b.personName
right outer join
(SELECT personName, MAX(ID) maxID FROM @tab1 group by personName) x
ON  a.id = x.maxID and a.personName = x.personName
14 май 12, 12:13    [12549013]     Ответить | Цитировать Сообщить модератору
 Re: Как наиболее эффективно заджойнить на макс. значение?  [new]
RubinDm
Member

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

SELECT aMax.*, b.*
FROM   @tab2 b
cross apply
  ( select top 1 t.id, t.personName
    from tab1 t
    where t.personName = b.personName
    order by id DESC -- сотрируем по убыванию, Max окажется наверху, возьмем в итоге только Top 1, т.е. max(t.id)
  ) aMax


понятно, что нужны индексы по tab1.id, + по personName в обеих таблицах.
но вообще, джойнить по строковым полям - это жесть, даже если поля будут индексированными.
17 май 12, 22:08    [12573430]     Ответить | Цитировать Сообщить модератору
 Re: Как наиболее эффективно заджойнить на макс. значение?  [new]
офигеть
Guest
RubinDm,

ну да, сервер загнется, если по строке с именем будет соединять, ага!
18 май 12, 10:59    [12575161]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить