首页 > 解决方案 > 在 SQL 中选择不同的对

问题描述

给定表

对于此表,每列都有不同的行,即 count(Name) = count(Spouse_Name) = count(*) 想要编写一个 SQL 查询,其中对(Name 和 Spouse_Name)是不同的,即 Alex Sandra 和 Sandra Alex 相同。

输出应如下:

输出必须是这个

注意:如果可能,请自行加入。

标签: mysqlsqlinner-joinself-join

解决方案


假设nameandspouse_name永远不会在同一行中相等,您可以NOT EXISTS像这样使用:

select t.*
from tablename t
where t.name < t.spouse_name
or not exists (
  select 1 from tablename
  where name = t.spouse_name and spouse_name = t.name
)

此代码适用于任何数据库,因为它使用标准 SQL。
对于 MySql 和此示例数据,您可以执行此自连接:

select distinct
  least(t1.name, t1.spouse_name) name, 
  greatest(t1.name, t1.spouse_name) spouse_name
from tablename t1 inner join tablename t2
on t1.name = t2.spouse_name and t2.name = t1.spouse_name

尽管没有连接也可以获得相同的结果:

select distinct
  least(t1.name, t1.spouse_name) name, 
  greatest(t1.name, t1.spouse_name) spouse_name
from tablename t1

还有另一个带有自连接的查询:

select t1.name, t1.spouse_name 
from tablename t1 inner join tablename t2
on t2.spouse_name = t1.name and t2.name = t1.spouse_name 
where t1.name < t1.spouse_name 

推荐阅读