2014-10-20 50 views
1

我想建立一个SQL查询,其中根据特定条件选择唯一的行,但是我在如何构建它时遇到困难。用于选择值的唯一组合的SQL查询,忽略两列次序

行有一个varchar对话ID,varchar发件人和varchar收件人。

我需要的结果是对话ID和发件人和收件人的所有不同组合,但收件人列中的发件人重复或反之亦然被视为相同。

例如:

ID  ,Sender  ,Recip 
------------------------- 
Convo1 ,PersonA  ,PersonB 
Convo1 ,PersonB  ,PersonA 
Convo1 ,PersonC  ,PersonA 
Convo1 ,PersonC  ,PersonA 
Convo1 ,PersonA  ,PersonC 
Convo1 ,PersonC  ,PersonA 
Convo2 ,PersonB  ,PersonD 
Convo2 ,PersonB  ,PersonA 

,将返回的查询:

select id, (case when sender < recip then sender else recip end) as person1, 
     (case when sender < recip then recip else sender end) as person2 
from conversations 
group by id, 
     (case when sender < recip then sender else recip end), 
     (case when sender < recip then recip else sender end); 

许多数据库支持:

Convo1, PersonA, PersonB 
Convo1, PersonC, PersonA 
Convo2, PersonB, PersonD 
Convo2, PersonB, PersonA 

回答

5

在标准SQL中,你会使用case语句做到这一点least()greatest()函数简化了t他的代码是:

select id, least(sender, recip) as person1, greatest(sender, recip) as person2 
from conversations 
group by id, least(sender, recip) as person1, greatest(sender, recip); 
+0

我不得不添加明显得到独特的组合,但除此之外,这个工作太棒了! – user1958698 2014-10-20 19:06:57

+0

@ user1958698。 。 。 “分组”并没有产生独特的结果? – 2014-10-20 21:38:12

0

一种选择是以某种方式排列对话。由于您的发送者和接收者是varchar S,按字母顺序似乎的是最简单的:

SELECT DISTINCT 
    ID, 
    CASE WHEN Sender <= Recip 
     THEN Sender 
     ELSE Recip 
     AS Person1, 
    CASE WHEN Sender <= Recip 
     THEN Recip 
     ELSE Sender 
     AS Person2 
FROM Conversations