2014-07-15 4 views
0

Je dois distinguer à la fois SenderId et RecipientId.SELECT DISTINCT avec deux colonnes

Je l'ai fait:

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 

Et cela fonctionne, mais je dois aussi le domaine M.Text là, mais sans distinctes. J'ajouté ceci:

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

Mais cela ne fonctionne pas.

+3

pourrait-il y avoir plus d'un M.Text pour chaque M.Sender distinct, R.StudentId? Si oui, lequel choisiriez-vous? –

+0

Ajout de la balise 'sql-server' en raison du mot-clé' (nolock) ' –

+0

L'utilisation de' separate' ** et ** 'group by' n'a pas de sens –

Répondre

2

Voici quelques options; pas sûr du libellé qui correspond le mieux à vos besoins, mais suspect une volonté ...

--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 

ou

--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

Cela ne fonctionne pas puisque le "max (M.Text)" obtient le texte où la longueur est plus grande que les autres qui est liée à ces deux ids au lieu du texte par rapport à la ligne la plus récente –

+0

@FelipeSkinner; cela fonctionne en fonction de ce que l'exigence est. Vous parlez du deuxième SQL. Pour chaque combinaison expéditeur/destinataire distincte, elle renvoie une seule valeur message.text arbitraire (max) parmi celles associées à cette combinaison d'expéditeur/destinataire. – JohnLBevan

+1

@FelipeSkinner concernant votre commentaire sur la longueur; il n'y a pas de logique pour cela - max appliqué à une chaîne (varchar, etc) donne la dernière valeur quand il est trié par ordre alphabétique (ie 'AAA', 'B' il retourne 'B', donné 'AAA', 'A' retournerait 'AAA'). – JohnLBevan

0

Si je l'ai bien compris votre question, ce groupera ce que vous voulez et distinct SenderId et 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