删除每个ID的溢出记录

时间:2014-05-27 21:22:06

标签: sql sql-server-2012 delete-row

我需要每个ID有4条或更少的记录。一些ID有超过4条记录。我需要删除超出限制的记录,因此每个ID有4条记录 我尝试了很多东西,但我找到的唯一解决办法就是在ID超过4时删除所有记录。
这是我获取每个ID记录数量的代码:

select count(voorwerpnummer) AS plaatjes, voorwerpnummer
from Illustraties INNER JOIN items 
ON Illustraties.itemID = items.ID
INNER JOIN tbl_voorwerp 
ON items.ID = tbl_voorwerp.voorwerpnummer
group by voorwerpnummer
order by plaatjes DESC

我有这一行来删除每个itemID的额外记录:

DELETE FROM illustraties 
WHERE plaatjefile NOT IN (select top 4 plaatjefile from illustraties where itemID = 110769395358)
AND itemID = 110769395358

现在我需要通过所有具有4条以上记录的itemID进行迭代。 这是如何获得超过4条记录的所有itemID:

WITH cte AS
(
   SELECT *,
     ROW_NUMBER() OVER (PARTITION BY itemID ORDER BY itemID) AS rn
   FROM illustraties
)
SELECT distinct ItemID
FROM cte
WHERE rn > 4

任何人都可以让我通过所有那些itemID并执行删除声明吗? 或者进行查询,为每个ID添加一个rownumber 例如:一个ID有5条记录。 5条记录得到数字1到5.下一个ID有8条记录。 8条记录得到数字1到8 这样我就可以删除rownumber为5或更高的记录。

2 个答案:

答案 0 :(得分:0)

希望您需要从Illustraties表中删除记录。您可以共享表结构以及该表的唯一键字段。

答案 1 :(得分:0)

鲜为人知的是,您可以从CTE或派生表中删除:

WITH cte AS
(
   SELECT *,
     ROW_NUMBER() OVER (PARTITION BY itemID ORDER BY itemID) AS rn
   FROM illustraties
)
DELETE cte
FROM cte
WHERE rn > 4

我刚换了一行。您的ORDER BY应该真正创建一个总订单。如果不是SQL Server有一些记录要删除的自由。可能是武断的,不符合你的利益。