用于选择唯一值组合的 SQL 查询,忽略两列顺序

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

将返回的查询:

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

最佳答案

在标准 SQL 中,您可以使用 case 语句来执行此操作:

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

许多数据库支持 least()greatest() 函数,这可以简化代码:

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

关于用于选择唯一值组合的 SQL 查询,忽略两列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472760/

相关文章:

mysql - 关系表的最佳方式

php - SQL INSERT INTO 不起作用

sql - 在运行时将 SQL 转换为 Linq To Objects 表达式

sql - 通过SSH/Qshell的SQL命令

android - SQLite 在查询中跳过一个词

c# - Linq to SQL - 连接和 Skip+Take

sql - 如何Select master table data和select reference table top one data sql查询

mysql - 在 Rails 查询中使用 AND 和 OR 进行过滤

java - 从 SQL 查询中获取表值

sql - Oracle SUM 返回错误的摘要,其中包含从 SELECT UNION 返回的相同值