TSQL Cross Apply не работает должным образом
Есть 3 таблицы:
- пользователей
- Depts (хотя, кажется, не обязательно для запроса, но...)
- Сообщения
Пользователи:
UID, DeptID, Name, Surname, Admin
U1 DeptA John Doe 0
U2 DeptB Jack Fisher 0
U3 DeptA Jill Smith 0
U4 DeptA Joan Green 1
U5 DeptC Jeff Jones 1
U6 DeptA Amanda Reed 0
......
Depts:
DeptID, DeptName
DeptA Denver
DeptB Boston
DeptC Seattle
Сообщения:
Sender, Receiver, Message, CreatedDate, Seen
U1 U3 Msg1 20152310 0
U1 U4 Msg2 20152310 0
U4 U1 Msg3 20152310 0
U3 U4 Msg4 20152310 0
U1 U3 Msg5 20152310 0
U3 U1 Msg6 20152310 0
(Пользователи могут отправлять сообщения только другим пользователям в том же отделе)
с входным параметром только один параметр, таким образом, UID
Мне нужно создать список со всеми пользователями одного и того же отдела (кроме ввода UID) в качестве заголовков, поэтому в примере
U3 U4 U6
с их реквизитами (имя, фамилия) для создания списка вкладок
а затем для каждого из указанных выше UID - список с последними 20 сообщениями, в которых U1 участвует как в качестве отправителя, так и получателя.
Заполнить боковую панель чата вы можете здесь: http://www.keenthemes.com/preview/metronic/theme/admin_4/
нажав на верхний правый значок
Я пытался с этим.., но есть много дубликатов, которые не знают, как удалить: возможно, перекрестное применение не правильная команда...:-(
SELECT u.UID,
u.PWD,
i.Sender,
I.MessageText
.....
FROM (
SELECT S.UID,
S.PWD
FROM dbo.Users u
JOIN dbo.Users u2 ON u.DeptID=u2.DeptID
WHERE u2.UID=@_UID
ORDER BY u.Admin DESC
) AS u
CROSS APPLY
(
SELECT TOP (20)
m.Sender,
m.Message,
m.CreatedDate,
m.Seen
FROM dbo.Messages m
WHERE m.Sender=@_UID
OR m.Receiver=@_UID
ORDER BY m.CreatedDate DESC
) m;
Можете подсказать что не так?
Спасибо
Джо
1 ответ
Честно говоря, я не могу понять, что именно пытался сделать ваш запрос. Но если посмотреть на страницу, на которую вы ссылались, и описание вашей проблемы, кажется, что вы хотите, чтобы запрос заполнял список пользователей (кроме текущего пользователя), а другой - для получения сообщений, относящихся к этому пользователю.
Рассмотрим что-то вроде:
DECLARE @_UID varchar(2) = 'U3';
-- Query for populating list of users
SELECT [UID], [Name] + ' ' + [Surname] AS [FullName]
FROM [dbo].[Users]
WHERE [UID] <> @_UID
ORDER BY [Admin] DESC, [Surname], [Name];
-- Query for populating messages
SELECT TOP 20 S.[UID] AS [SenderUID], S.[Name] + ' ' + S.[Surname] AS [SenderFullName],
R.[UID] AS [ReceiverUID], R.[Name] + ' ' + R.[Surname] AS [ReceiverFullName],
M.[Message], M.[CreatedDate], M.[Seen]
FROM [dbo].[Messages] M
INNER JOIN [dbo].[Users] S ON S.[UID] = M.[Sender]
INNER JOIN [dbo].[Users] R ON R.[UID] = M.[Receiver]
WHERE @_UID IN(M.[Sender], M.[Receiver])
ORDER BY M.[CreatedDate] DESC;
Что касается использования APPLY, оно похоже на JOIN. Используя JOIN, вы объединяете набор известных результатов (например, содержимое таблицы) с другим набором результатов, который также известен. При использовании APPLY набор результатов с правой стороны не обязательно должен быть известен - например, вы можете использовать функцию для вычисления результата на основе результатов с левой стороны.