【发布时间】:2012-02-10 08:38:56
【问题描述】:
我的问题类似于sql statement to delete records older than XXX as long as there are more than YY rows,但这个问题只涉及一个单亲,我想一次性删除所有父母的记录。
考虑这张表:
CREATE TABLE Children
(
ChildId int NOT NULL,
ChildCreated datetime NOT NULL,
ParentId int NOT NULL
)
这可以是任何父子关系,因此名称是通用的。
我想删除所有超过一个月的孩子,但需要为每个父母保留最少数量的孩子,无论他们的年龄如何。
我尝试了一些带有嵌套 SELECT 和 GROUP BY 的语句,这些语句给了我一些结果,但没有一个给我正确的结果集。
因为我使用的是 SQL Server,所以我想出了以下效果很好的解决方案:
WITH CTE AS
(
SELECT ROW_NUMBER() OVER (Partition BY ParentId ORDER BY ChildCreated DESC)
As RowNo, ChildCreated FROM Children
)
DELETE FROM CTE WHERE RowNo > 10
AND RevisionCreated < DATEADD(MONTH,-1,GetDate())
公用表表达式将每个父级的所有子级组合在一起,并根据创建顺序添加一个连续的行号。每个父母的最新孩子有 行号为 1,最新的第十个有 10。所以我可以删除所有一行的记录 大于 10,只要它们也超过一个月。
我的问题是,如果我必须在不支持 CTE 的系统上做同样的事情怎么办。这个问题的 ANSI SQL-92 解决方案是什么?
【问题讨论】:
-
据我所知,CTE 在 ANSI SQL 99 标准中有效。也许您想要一个不支持该标准的数据库解决方案? (也许是 MySQL?)
-
@MarkByers 我不知道 CTE 在 SQL-99 中,是的,我会对不支持 CTE 的系统的解决方案感兴趣。我将问题改为询问 SQL-92。
标签: sql-server delete-row sql-delete