SQL:从表中删除非重复条目

3

我有一个包含两列CountryCode CountryName的表格。在countrycode中有重复的条目。但我想删除非重复的条目,并保留countrycode列中重复的行。因此,我正在尝试编写一条SQL语句来完成这个任务。我认为我需要使用Having,但不太确定如何确切地将其合并到语句中。谢谢。


1
你现在做了什么?你正在使用哪种SQL语言(mssql, mysql, oracle,...)? - undefined
为什么你不检查一下我的答案呢?它只会返回重复的内容。 - undefined
如果您能提供一些示例输入和输出,我们可以提供更好的答案。 - undefined
2个回答

3

这有点奇怪。我原以为你想要删除重复的条目,而不是相反的。但是无论你使用什么数据库,以下类似的方法都可以解决:

delete from TableName
 where CountryCode in (select CountryCode
                         from TableName
                        group by CountryCode
                        having count(*) = 1).

为了明确起见,子查询:

select CountryCode
  from TableName
 group by CountryCode
having count(*) = 1

该查询返回具有唯一CountryCodes的行。然后是delete语句:

delete from TableName
 where CountryCode in (...)

删除那些唯一的行,只留下表中有重复的行。

然而,根据您的评论,似乎您只想要一个返回重复项的查询。如果是这样,请在 select 语句中使用子查询,但修改 having 子句以仅返回重复项:

select *
  from TableName
 where CountryCode in (select CountryCode
                        from TableName
                       group by CountryCode
                      having count(*) > 1)

因为我正在按CountryCode分组,对于每个CountryCodecount(*)返回具有相同CountryCode的行数。如果有重复项,自然而然,该值将是2或更多。但是如果没有重复项,该值将是1。所以当我说having count(*) = 1时,我实际上是在说我只对没有重复项的CountryCode感兴趣。 - undefined
如果还不清楚的话,请检查此查询的结果:select CountryCode, count(*) from TableName group by CountryCode,并注意每个CountryCodecount(*)值。这样应该会更清晰明了。 - undefined
我觉得我明白了,然而CountryCode的唯一条目显示出来,我希望它的重复项也能显示出来。举个例子,假设CountryCode为USA的在不同行上出现了多次,但是CountryCode为CAN的只在一行上出现,我想要删除那些有CAN的行,但保留USA的重复行。 - undefined
我觉得你理解得没错,但是似乎没有出现重复的行。不过我会仔细再看一下。 - undefined
1
我编辑了我的帖子。我认为可能有一点误解。希望这样更清楚了。祝好运。 - undefined
显示剩余2条评论

0

这是一个快速解决方案,可能不是最快的,但适用于大量条目。

SELECT * FROM [table] AS tbl 
   WHERE countrycode IN 
        (SELECT countrycode FROM [table] WHERE tbl.countryname <> countryname)    

/* Words in uppercase are SQL Syntax */

命名第一个表(tbl),您可以在嵌套查询中使用它。

我也试过了,但似乎不起作用。我正在仔细研究一下。对此感到抱歉。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接