Bezdepbonusu7Программирование: статьи и ответы

Вопрос

SELECT DISTINCT с двумя столбцами

Автор вопроса: Matheus LimaОтветов: 2

Мне нужно различать как 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

Но это не работает.

  • Может ли быть более одного M.Text для каждого отдельного M.Sender, R.StudentId? Если да, то какой из них вы хотели бы выбрать? John Hartsock 16.07.2014
  • Добавлен тег sql-server из-за ключевого слова (nolock) a_horse_with_no_name 16.07.2014
  • Использование distinct и group by не имеет смысла a_horse_with_no_name 16.07.2014
  • Вам не нужны оба DISTINCT и GROUP BY. Вы также можете использовать WHERE вместо HAVING. Taryn 16.07.2014
  • @djikay Вам не нужно выбирать столбец, чтобы использовать его в группе, Lamak 16.07.2014
  • ... но это хорошая практика! Strawberry 16.07.2014

sqlsql-servergroup-byselectdistinct

Ответы

Ответ 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы