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

SQL:在一列中查找非唯一记录,这些记录在另一列中也是非唯一的,sql,database,Sql,Database,我有一个地方及其地区的表格,但有时在同一地区有多个同名的地方。现实生活中的例子:有。我住的新斯科舍省,有。我需要找到这些类型的记录,或者消除它们的歧义(例如,通过添加它们的县或等效项),或者只是删除垃圾/重叠的记录。这将需要一些工作,但首先我想看看有多少工作 这是一个好的开始,但我想跳过在同一状态下不会出现多次的名称,直接进入问题案例。一般来说,我想在一列中找到非唯一的记录,然后从中得到另一列中非唯一的记录 (FWIW,我使用的是MariaDB,它主要与MySQL兼容。)我认为您可以连接列: S

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

这是一个好的开始,但我想跳过在同一状态下不会出现多次的名称,直接进入问题案例。一般来说,我想在一列中找到非唯一的记录,然后从中得到另一列中非唯一的记录


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

我认为您可以连接列:

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

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

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

 select PlaceName , RegionName
 from Places
 group by PlaceName , RegionName
 having count(*) >1
基本上你想

  • 首先计算每个(位置/区域)元组存在的频率
  • 然后只过滤那些出现多次的
我们就这么做吧

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

一种方法是将
加入到聚合列表中。您需要按地区和地点进行聚合,以获得所需的列表:

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;

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

这里不需要concat,只需按两个字段分组即可。这很有用-我没有得到每个记录,但我可以看到:
Sandy Cove | Nova Scotia | 3
。谢谢这对我来说不起作用,它实际上扩大了结果集!不过,谢谢!谢谢我使用的是MariaDB(MySQL兼容)。这似乎得到了一条符合条件的记录,但只有一条。但它确实告诉我,我要处理多少组这样的问题。
SELECT
  PlaceName, RegionName, Count(*) AS num
FROM Places
  GROUP BY CONCAT(PlaceName,':::',RegionName)
HAVING COUNT(*)>1
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;