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

Откуда:
Сообщений: 5
Всем привет.

Помогите составить простой запрос, но я пока не смог:

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

Users:
UserId UserName FirstName LastName
1 user1 user1first user1last
2 user2 user2first user2last
3 user3 user3first user3last

Quoters:

QuoterId Message DatePost UserId
1 user1-1 01.01.2000 1
2 user1-2 02.01.2000 1
3 user1-3 03.01.2000 1
4 user2-1 05.01.2000 2
5 user3-1 27.01.2000 3
6 user3-2 01.01.2000 3


Надо: выбрать для всех юзеров по каждому последнему сообщению,должен быть итог:


1 user1 user1first user1last 3 user1-3 03.01.2000
2 user2 user2first user2last 4 user2-1 05.01.2000
3 user3 user3first user3last 5 user3-1 27.01.2000

Я пока смог только так:

SELECT * ,
(SELECT TOP (1) Message
FROM Quoters
WHERE (Users.UserId = UserId ORDER BY DatePost)) AS Expr1
FROM Users

Вот так уже не хочет:
SELECT *,
(SELECT TOP (1) *
FROM Quoters
WHERE (Users.UserId = UserId ORDER BY DatePost)) AS Expr1
FROM Users
2 окт 09, 10:21    [7733039]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
korteek,

версия сервера?
2 окт 09, 10:25    [7733069]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
aleks2
Guest
select Q.*, U.*
FROM 
(select max(DatePost)) DatePost, UserId from Quoters group BY UserId) X
LEFT OUTER JOIN
Quoters Q
ON X.DatePost=Q.DatePost AND X.UserId=Q.UserId
LEFT OUTER JOIN
Users U
ON
U.UserId=X.UserId
2 окт 09, 10:30    [7733109]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
то korteek
Вам действительно в результирующем наборе нужно из [Quoters] не только DatePost но и QuoterId?

--------------------------------------------------------------
Дьявол кроется в деталях.
2 окт 09, 10:34    [7733160]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
korteek
Member

Откуда:
Сообщений: 5
Дедушка,

угу.. на самом деле там еще будет одна таблица, но я думаю её я приклею. основное вот этот сделать.

PaulYoung,
Версия.
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)
Feb 9 2007 22:47:07
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)


aleks2, пасиб. ща попробую.
2 окт 09, 10:38    [7733196]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
Orland
Member

Откуда: Ростов
Сообщений: 71


Create table #Quoters
(
	QuoterId int ,
	Message varchar(1000),
	DatePost smalldatetime,
	UserId int
)

Insert into #Quoters
Values ( 1, 'user1-1', '2000-01-01', 1)
Insert into #Quoters
Values ( 2, 'user1-2', '2000-01-02', 1)
Insert into #Quoters
Values ( 3, 'user1-3', '2000-01-03', 1)
Insert into #Quoters
Values ( 4, 'user2-1', '2000-01-05', 2)
Insert into #Quoters
Values ( 5, 'user3-1', '2000-01-27', 3)
Insert into #Quoters
Values ( 6, 'user3-2', '2000-01-01', 3)

Create table #Users
(
	UserId int,
	UserName varchar(100),
	FirstName varchar(100),
	LastName varchar(100)
)
Insert into #Users
Values ( 1, 'user1', 'user1first', 'user1last')
Insert into #Users
Values ( 2, 'user2', 'user2first', 'user2last')
Insert into #Users
Values ( 3, 'user3', 'user3first', 'user3last')


--drop table #users
--drop table #quoters
select U.*, Q.*
FROM 
(select max(DatePost) DatePost, UserId from #Quoters group BY UserId) X
LEFT OUTER JOIN
#Quoters Q
ON X.DatePost=Q.DatePost AND X.UserId=Q.UserId
LEFT OUTER JOIN
#Users U
ON
U.UserId=X.UserId

1 user1 user1first user1last 3 user1-3 2000-01-03 00:00:00 1
2 user2 user2first user2last 4 user2-1 2000-01-05 00:00:00 2
3 user3 user3first user3last 5 user3-1 2000-01-27 00:00:00 3
2 окт 09, 10:38    [7733199]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
korteek,

если у Вас => 2005, то как-то так
SELECT u.*, q.* FROM @users u
OUTER APPLY (SELECT TOP 1 * FROM @Quoters q WHERE q.UserId = u.UserId ORDER BY q.DatePost DESC) q
2 окт 09, 10:39    [7733208]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
aleks2
select Q.*, U.*
FROM 
(select max(DatePost)) DatePost, UserId from Quoters group BY UserId) X
LEFT OUTER JOIN
Quoters Q
ON X.DatePost=Q.DatePost AND X.UserId=Q.UserId
LEFT OUTER JOIN
Users U
ON
U.UserId=X.UserId
Тут -> max(DatePost)) лишняя скобка. А-то автор скажет, что не выполняется из-за "Incorrect syntax near the keyword 'from'"...
2 окт 09, 10:43    [7733241]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
Orland,
aleks2 выиграл
2 окт 09, 10:47    [7733270]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
korteek,
для 2005 и выше.
select *
FROM 
Users U
LEFT JOIN
(select *, row_number() over(partition by UserId order by DatePost desc) rn from Quoters) Q
ON
U.UserId=Q.UserId and rn = 1
2 окт 09, 10:49    [7733288]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
ну чтобы автору было из чего выбирать :)
select
    u.UserId
    ,u.UserName
    ,u.FirstName
    ,u.LastName
    ,t.QuoterId
    ,t.Message
    ,t.DatePost
from
    (
    select top 1 with ties
        q.QuoterId
        ,q.Message
        ,q.DatePost
        ,q.UserId
    from
        @Quoters q
    order by
        row_number() over(partition by UserId order by q.DatePost desc)
    )t
    inner join @Users u on u.UserId = t.UserId
--------------------------------------------------------------
Дьявол кроется в деталях.
2 окт 09, 10:55    [7733349]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
korteek
Member

Откуда:
Сообщений: 5
Спасиб всем!

ОЧень помогли. А какой запрос оптимальней?

Дело в том, что мне еще приклеить надо одну таблицу.

Quoters: SourceId


PostSources

SourceId
SourceName

Ну это просто список имен такой. откуда было отправлено сообщение.

Вот получился такой запрос:

select U.UserName,y.Message,y.DatePost, y.SourceName 
FROM 
(select max(DatePost) DatePost, UserId from Quoters group BY UserId) X
LEFT OUTER JOIN
(select q.*,s.SourceName from Quoters Q LEFT OUTER JOIN PostSources s on q.SourceId=s.SourceId) y
ON X.DatePost=y.DatePost AND X.UserId=y.UserId
LEFT OUTER JOIN
Users U
ON
U.UserId=X.UserId
order by U.UserName

ваше мнение - оставить такой? или как?
2 окт 09, 14:58    [7735560]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
korteek,

ещё один LEFT JOIN не осилите? А оптимальный для Вас запрос тот, который быстрее работает (про план запроса говорить не будем).
2 окт 09, 16:00    [7736007]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
korteek
Member

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

чессно говоря, я пока еще на Вы с SQL :)

кстати, а как проверить время выполнения запрос в VisualStudio 9?
2 окт 09, 16:34    [7736246]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
korteek
кстати, а как проверить время выполнения запрос в VisualStudio 9?
Ну по своим наручным часам засеките, например или в уме посчитайте
2 окт 09, 16:49    [7736356]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать одну последнюю запись из другой таблицы  [new]
korteek
Member

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

шутку юмора оценил :)
2 окт 09, 20:33    [7737163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить