SQL:在一个列中查找在另一列中也不唯一的非唯一记录
Posted
技术标签:
【中文标题】SQL:在一个列中查找在另一列中也不唯一的非唯一记录【英文标题】:SQL: Find non-unique records in one column that are also non-unique in another column 【发布时间】: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
此查询基于来自另一个 question 的 answer,它为我提供了所有同名地点:
SELECT * FROM Places WHERE PlaceName IN
(SELECT PlaceName FROM Places GROUP BY PlaceName HAVING COUNT(*) > 1);
这是一个好的开始,但我想跳过在同一状态下不多次出现的名称,直接进入问题案例。概括地说,我想在一列中查找非唯一记录,然后从那里获取另一列中非唯一的记录。
(FWIW,我使用的是 MariaDB,它主要与 mysql 兼容。)
【问题讨论】:
【参考方案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);
如果我错了,我相信其他 ***ers 会告诉我的!! :D
【讨论】:
它对我不起作用,它实际上扩大了结果集!不过谢谢!【参考方案4】:我不确定,但似乎只是简单地按两个字段分组
select PlaceName , RegionName
from Places
group by PlaceName , RegionName
having count(*) >1
【讨论】:
这似乎确实获得了符合条件的记录,但只有一个。但它确实告诉我需要处理多少组。以上是关于SQL:在一个列中查找在另一列中也不唯一的非唯一记录的主要内容,如果未能解决你的问题,请参考以下文章