我想在创建查询以删除重复项的过程中向您寻求帮助,但是保留了另一个表中具有最大值的记录。
我对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
中的孤立记录(主要没有相关记录)也应删除。
我没有找到适合我的问题的东西-所有类似的问题都与一张表中的数据有关-我正在努力寻找解决方案几天了。
您有一些想法可以达到结果吗?
答案 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
哪个做得好。
现在您可以随心所欲地否决我的问题...