2014-07-15 82 views
0

我需要清除SenderIdRecipientIdSELECT DISTINCT with two columns

所以我这样做:

SELECT DISTINCT M.SenderId, R.StudentId as RecipientId 
FROM Message M (nolock) INNER JOIN Recipient R (nolock) ON M.Id=R.MessageId 
GROUP BY M.SenderId, R.StudentId 
HAVING StudentId=1 OR SenderId=1 

而这个工作,但我还需要M.Text场在那里,但没有明显的。 所以我加了这个:

GROUP BY M.SenderId, R.StudentId, M.Text 

但是这不起作用。

+3

对于每个不同的M.Sender,R.StudentId是否可以有多个M.Text?如果是的话,你想选择哪一个? –

+0

由于'(nolock)'关键字添加了'sql-server'标签 –

+0

使用'distinct' **和**'group by'没有意义 –

回答

2

这里有一些选项;不是从最适合您的要求的措辞,但犯罪嫌疑人将一个肯定...

--selects unique combination of sender, recipient and text 
--meaning the combo of 3 is unique, but within that combo values 
--in each individual column may be repeated 

SELECT DISTINCT M.SenderId 
, R.StudentId as RecipientId 
, M.Text 
FROM Message M (nolock) 
INNER JOIN Recipient R (nolock) ON R.MessageId = M.Id 
where StudentId=1 
or SenderId=1 

--returns all unique combos of SenderId and RecipientId 
--along with a single corresponding Text field 
--max() is just an arbitrary aggregate function to ensure we only 
--get 1 result for M.Text 

SELECT M.SenderId 
, R.StudentId as RecipientId 
, max(M.Text) 
FROM Message M (nolock) 
INNER JOIN Recipient R (nolock) ON R.MessageId = M.Id 
where StudentId=1 
or SenderId=1 
group bu M.SenderId 
, R.StudentId 
+0

这是行不通的,因为“max(M.Text)”得到的文本长度大于其他与这两个ID相关的文本,而不是相对于最近行的文本 –

+0

@FelipeSkinner;它的工作取决于需求是什么。你指的是第二个SQL。对于每个不同的发件人/收件人组合,它将返回与发件人/收件人组合关联的任意(最大)message.text值。 – JohnLBevan

+1

@FelipeSkinner关于你对长度的评论;这是没有逻辑 - 最大应用于一个字符串(varchar,等)价值提供最后一个值时,按字母顺序排序(即给予'AAA','B'它会返回'B';给予'AAA','A'它会返回'AAA')。 – JohnLBevan

0

如果我正确理解你的问题,这会组你想要什么,不同的SenderId和StudentId:

SELECT M.SenderId, R.StudentId as RecipientId, M.Text 
FROM Message M (nolock) INNER JOIN Recipient R (nolock) ON M.Id=R.MessageId 
GROUP BY M.SenderId, R.StudentId, M.Text 
HAVING COUNT(StudentId) = 1 OR COUNT(SenderId) = 1