【问题标题】:Select distinct pairs in SQL在 SQL 中选择不同的对
【发布时间】:2020-06-25 16:10:20
【问题描述】:

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

输出应该如下:

注意:如果可能,请自行内连接。

【问题讨论】:

  • 请说明您尝试过的方法以及您面临的确切问题。
  • 你有没有试过???
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。不要让我们做你的功课。

标签: mysql sql inner-join self-join


【解决方案1】:

未经测试:

select distinct t1.name, t1.spouse_name
from table t1
inner join table t2
on concat(t1.name, t1.spouse_name) = concat(t2.spouse_name, t2.name)

我在您的帖子中找不到表名,所以我使用了名称table

【讨论】:

    【解决方案2】:

    假设namespouse_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
    

    虽然不用join也能得到同样的结果:

    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 
    

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2011-02-20
      • 2012-01-19
      • 2011-12-20
      • 2016-05-11
      相关资源
      最近更新 更多