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;