2015-10-23 2 views
0

Есть 3 таблицы:TSQL Cross Нанести не работает, как ожидалось

  • Пользователи
  • 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 
     ...... 

Отдела:

 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 [email protected]_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 [email protected]_UID 
      OR  [email protected]_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; 

относительно пользования ОТНОСИТЬСЯ, он похож на JOIN. При использовании JOIN вы комбинируете набор результатов, которые известны (например, содержимое таблицы), на другой набор результатов, который также известен. При использовании APPLY правильный набор результатов не обязательно должен быть известен - например, вы можете использовать функцию для вычисления результата на основе результатов левой стороны.

+0

Привет! Спасибо за ответ. На самом деле, моя цель состояла в том, чтобы собрать все вместе в один единственный запрос, но, возможно, это намного проще хранить 2 отдельных запроса ... Я еще немного подумаю. – Joe

+0

Причина, по которой я буду использовать два запроса, состоит в том, что если у пользователя более одного сообщения, они будут в результатах дважды, но тогда у вас будут дубликаты в списке пользователей. Личный опыт также учил меня, что несколько небольших запросов, которые возвращают именно то, что я хочу для определенного представления, обычно быстрее, чем попытка использовать вывод более сложного запроса для нескольких видов. – izzy

+0

Да, я вижу .. и на самом деле это то, что я обычно делаю, но хотел бы посмотреть, было ли элегантное решение с одним запросом. – Joe

Смежные вопросы