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