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

Sql server 2008 如何从没有主键的表中选择不同的行,sql-server-2008,Sql Server 2008,如果有任何未读消息,我需要在用户登录时显示通知。因此,如果多个用户在脱机状态下分别发送5条消息,则这些消息应在登录时显示。意味着必须显示来自每个用户的最后消息 我使用加入来查找记录 在此场景中,来自用户的消息不是主键 这是我的问题 SELECT UserMessageConversations.MessageFrom, UserMessageConversations.MessageFromUserName, UserMessages.MessageTo, UserMessage

如果有任何未读消息,我需要在用户登录时显示通知。因此,如果多个用户在脱机状态下分别发送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
这是从上述查询中获得的输出

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


怎么可能

我不完全确定我是否完全理解您的问题,但一种方法是使用CTE公共表表达式

有了这个CTE,您可以按照一些标准(即MessageFrom)对数据进行分区,并让SQL Server对每个分区的所有行从1开始编号,然后按照其他一些标准进行排序—这是您的问题中完全不清楚的一点,无论您是否关心每个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列排序,以便选择最新的消息


这是否接近您要查找的内容???

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

通常,对于distinct子句,每个不同的行属性组都有一行。
如果您的要求是为所有消息显示一个单独的字段,例如:每个消息折叠在一个消息中,在它们之间有一个分隔符,那么您可以使用聚合函数,但在SQL Server中,

这两个记录在“消息”字段中是不同的。您将如何决定放映哪一部?另外,请发布您的表格结构和示例数据。谢谢。但是那是两行,因为它们包含两条独立的消息。你需要告诉我们你是如何决定不同的,因为这些对我来说不是不同的。当所有其他列都相同时,您是否关心收到的消息?那么,是否有任何理由在查询中包含该消息?是的,我知道Distinct不工作,因为message列。我需要显示最后一条消息和未读消息的计数。我只是指Messagefrom列的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