我有一张地方及其地区的表格,但有时在同一地区有不止一个同名的地方。现实生活中的例子:有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
此查询基于另一个answer的question,获取了所有具有相同名称的地点:
SELECT * FROM Places WHERE PlaceName IN
(SELECT PlaceName FROM Places GROUP BY PlaceName HAVING COUNT(*) > 1);
这是一个好的开始,但我想跳过在同一状态下不会出现多次的名称,直接解决问题情况。一般来说,我想在一列中找到非唯一记录,并从那里获得另一列中不唯一的记录。
(FWIW,我使用的是MariaDB,它主要与MySQL兼容。)
答案 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