2014-10-20 54 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