如何从没有主键的表中选择不同的行

时间:2012-06-16 15:13:38

标签: sql-server-2008

如果有任何未读消息,我需要在用户登录时显示通知。因此,如果多个用户在用户处于离线状态时发送(每个5条消息),则应在登录时显示这些消息。手段必须显示每个用户的最后消息。

我使用加入查找记录。

在此方案中,来自用户的消息不是主键。

这是我的查询

SELECT 
   UserMessageConversations.MessageFrom,  UserMessageConversations.MessageFromUserName,
   UserMessages.MessageTo, UserMessageConversations.IsGroupChat, 
   UserMessageConversations.IsLocationChat, 
   UserMessageConversations.Message, UserMessages.UserGroupID,UserMessages.LocationID 
FROM    
   UserMessageConversations 
LEFT OUTER JOIN
   UserMessages ON UserMessageConversations.UserMessageID = UserMessages.UserMessageID 
WHERE
   UserMessageConversations.MessageTo = 743  
   AND UserMessageConversations.ReadFlag = 0

这是从上述查询中获得的输出。

enter image description here

MessageFrom -582出现两次。我只需要该用户的一条记录。

怎么可能

2 个答案:

答案 0 :(得分:0)

我不完全确定我完全理解你的问题 - 但一种方法是使用CTE(公用表格表达式)。

使用此CTE,您可以按照某些条件对数据进行分区 - 即MessageFrom - 并为每个分区的所有行开始SQL Server编号,按其他条件排序 - 这是从您的问题中完全不清楚,您是否关心每个MessageFrom数字的行是否排序(您是否有某种MessageDate或您可以订购的东西?)..

所以尝试这样的事情:

;WITH PartitionedMessages AS
(
   SELECT 
      umc.MessageFrom,  umc.MessageFromUserName,
      um.MessageTo, umc.IsGroupChat, 
      umc.IsLocationChat, 
      umc.Message, um.UserGroupID, um.LocationID ,
      ROW_NUMBER() OVER(PARTITION BY umc.MessageFrom
                        ORDER BY MessageDate DESC) AS 'RowNum' <=== totally unclear yet
   FROM    
      dbo.UserMessageConversations umc
   LEFT OUTER JOIN
      dbo.UserMessages um ON umc.UserMessageID = um.UserMessageID 
   WHERE
       umc.MessageTo = 743  
       AND umc.ReadFlag = 0
)
SELECT 
    MessageFrom,  MessageFromUserName, MessageTo, 
    IsGroupChat, IsLocationChat, 
    Message, UserGroupID, LocationID 
FROM 
   PartitionedMessages
WHERE
   RowNum = 1

在这里,我只选择每个“分区”的“第一个”条目(即每个MessageFrom) - 按“想象的”MessageDate列排序,以便最新(最新) )将选择消息。

这会接近你想要的吗?

答案 1 :(得分:0)

如果您将它们视为相同的行,我假设您不关心消息字段。 在这种情况下,您可以使用DISTINCT子句:

SELECT DISTINCT
   UserMessageConversations.MessageFrom,  UserMessageConversations.MessageFromUserName,
   UserMessages.MessageTo, UserMessageConversations.IsGroupChat, 
   UserMessageConversations.IsLocationChat, 
   UserMessages.UserGroupID,UserMessages.LocationID 
FROM    
   UserMessageConversations 
LEFT OUTER JOIN
   UserMessages ON UserMessageConversations.UserMessageID = UserMessages.UserMessageID 
WHERE
   UserMessageConversations.MessageTo = 743  
   AND UserMessageConversations.ReadFlag = 0

通常使用distinct子句,每个不同的行属性组都有一行。 如果您的要求是为所有消息显示单个字段(例如:每条消息折叠在一条消息中,并且它们之间有分隔符),您可以使用聚合函数,但在SQL Server中似乎是not that easy. < / p>