SQL:在一列中查找非唯一记录,这些记录在另一列中也是非唯一的

时间:2014-03-05 23:19:41

标签: sql database

我有一张地方及其地区的表格,但有时在同一地区有不止一个同名的地方。现实生活中的例子:有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

此查询基于另一个answerquestion,获取了所有具有相同名称的地点:

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

这是一个好的开始,但我想跳过在同一状态下不会出现多次的名称,直接解决问题情况。一般来说,我想在一列中找到非唯一记录,并从那里获得另一列中不唯一的记录。

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

4 个答案:

答案 0 :(得分:1)

基本上你想要

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

所以,让我们这样做

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

答案 1 :(得分: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;

您没有提到您正在使用的实际数据库。还有其他方法来表达这一点,有些方法取决于数据库。

答案 2 :(得分:0)

我认为你可以连接列:

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

如果我错了,我相信其他StackOverflowers会让我知道! :d

答案 3 :(得分:0)

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

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