T-SQL删除重复项,将重复表中的值保留为另一张表中的值

时间:2019-04-17 13:03:26

标签: sql-server duplicates max

我想在创建查询以删除重复项的过程中向您寻求帮助,但是保留了另一个表中具有最大值的记录。

我对SQL Server数据库进行了特殊设计。

主要

|ID|  URL     | some other columns
+--+----------+
|1 |  URL1    |
|2 |  URL1    | 
|3 |  URL2    |

热门

|ID|  MainID  |UseCount | SearchString
+--+----------+---------+--------------
|1 |  3       | 124     | Phrase1
|2 |  2       | 234     | Phrase2
|3 |  1       | 123     | Phrase3
|4 |  1       | 7       | Phrase4

因此,在Main表中,我获得了一些URL重复的URL列表。 在Populars表中,我有每个URL的UseCount记录-一个URL where Main.ID = Populars.MainID可能在这里有多个记录,但Populars中也可能没有相关记录在Main中记录。

问题是从Main中删除重复项,而在UseCount中保留最高Populars的副本。

我尝试了多种方法,但是没有找到解决方案...

此查询:

WITH ToDelete AS 
(
    SELECT 
        *,
        RN = ROW_NUMBER() OVER (PARTITION BY URL ORDER BY id) 
    FROM 
        Main
)
DELETE FROM ToDelete 
WHERE RN > 1

正确删除重复项,但保留“随机”(从UseCount的角度来看)记录。

我还想在Main表中创建一个附加列,将Main中的MAX(Usecount)中的所有URL与{{1}中的所有URL进行匹配,并将此值插入新的列,然后尝试删除重复项。这样可以解决Populars中有多个与main ...中的每个URL相关的记录的问题。

但是我对SQL查询不是很了解...

在最后,Populars中的孤立记录(主要没有相关记录)也应删除。

我没有找到适合我的问题的东西-所有类似的问题都与一张表中的数据有关-我正在努力寻找解决方案几天了。

您有一些想法可以达到结果吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方法。

我已经创建了一个视图:

create view [dbo].[MainWithUseCount] 
as
select  *, (select max(usecount) as MaxUseCont from [dbo].[Populars] where MainID = ID) as MaxUseCount from Main 
GO

然后,使用:

        WITH ToDelete AS 
        (SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY URL ORDER BY MaxUseCount DESC) 
         FROM MainWithUseCount)
 delete FROM ToDelete WHERE RN>1

哪个做得好。

现在您可以随心所欲地否决我的问题...