Мне нужно различать как SenderId, так и RecipientId.
Итак, я сделал это:
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
Но это не работает.
Ответ 1 · рейтинг 2 · JohnLBevan
Вот некоторые варианты; не уверен в формулировке, которая лучше всего соответствует вашим требованиям, но подозреваю, что...
--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
or
--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
Ответ 2 · Thomas Veil
Если я правильно понял ваш вопрос, это сгруппирует то, что вы хотите, и отдельные 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