【问题标题】:SQL: Find non-unique records in one column that are also non-unique in another columnSQL:在一个列中查找在另一列中也不唯一的非唯一记录
【发布时间】:2014-03-05 23:19:40
【问题描述】:

我有一张地点及其地区的表格,但有时同一地区有多个同名地点。现实生活中的例子:有five Springfields in Wisconsin。我住的新斯科舍省有three Sandy Coves。我需要找到这些类型的记录并消除它们的歧义(例如,通过添加他们的县或等效项)或者只是删除垃圾/重叠的记录。这需要一些工作,但首先我想看看有多少工作。

PlaceName:    RegionName:
Summerville   Big State
Summerville   Bigger State (OK, different states, no problem...)
Summerville   Little State <- 
Summerville   Little State <- I need to deal with these

此查询基于来自另一个 questionanswer,它为我提供了所有同名地点:

SELECT * FROM Places WHERE PlaceName IN
  (SELECT PlaceName FROM Places GROUP BY PlaceName HAVING COUNT(*) > 1);

这是一个好的开始,但我想跳过在同一状态下不多次出现的名称,直接进入问题案例。概括地说,我想在一列中查找非唯一记录,然后从那里获取另一列中非唯一的记录。

(FWIW,我使用的是 MariaDB,它主要与 MySQL 兼容。)

【问题讨论】:

    标签: sql database


    【解决方案1】:

    一种方法是使用join 到聚合列表。您需要按地区和地点进行汇总才能获得所需的列表:

    SELECT p.*, rp.cnt
    FROM Places p join
         (SELECT RegionName, PlaceName, COUNT(*) as cnt
          FROM Places
          GROUP BY  RegionName, PlaceName
          HAVING COUNT(*) > 1
         ) rp
         on p.RegionName = rp.RegionName and p.PlaceName = rp.PlaceName;
    

    您没有提及您正在使用的实际数据库。还有其他表达方式,其中一些取决于数据库。

    【讨论】:

    • 谢谢!我正在使用 MariaDB(与 MySQL 兼容)。
    【解决方案2】:

    基本上你想要

    • 首先计算每个(地点/区域)元组存在的频率
    • 然后只过滤那些出现多次的那些

    所以我们就这样做吧

    SELECT
      PlaceName, RegionName, Count(*) AS num
    FROM Places
      GROUP BY CONCAT(PlaceName,':::',RegionName)
    HAVING COUNT(*)>1
    

    【讨论】:

    • 这里不需要 concat,只需按两个字段分组即可。
    • 这很有用 - 我没有得到每条记录,但我可以看到:Sandy Cove | Nova Scotia | 3。谢谢!
    【解决方案3】:

    我认为你可以只连接列:

    SELECT * FROM Places WHERE PlaceName + RegionName IN
    (SELECT PlaceName + RegionName FROM Places GROUP BY PlaceName + RegionName HAVING COUNT(*) > 1);
    

    如果我错了,我相信其他 StackOverflowers 会告诉我的!! :D

    【讨论】:

    • 它对我不起作用,它实际上扩大了结果集!不过谢谢!
    【解决方案4】:

    我不确定,但似乎只是简单地按两个字段分组

     select PlaceName , RegionName
     from Places
     group by PlaceName , RegionName
     having count(*) >1
    

    【讨论】:

    • 这似乎确实获得了符合条件的记录,但只有一个。但它确实告诉我需要处理多少组。
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2019-08-05
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多