我的问题类似于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服务器,我想出了以下解决方案,它的伟大工程:
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解决方案?
就我所知,CTEs *在ANSI SQL 99标准中是有效的。也许你想要一个不支持标准的数据库解决方案? (MySQL也许?) – 2012-02-10 08:42:31
@MarkByers我不知道CTE在SQL-99中,是的,我会对不支持CTE的系统解决方案感兴趣。我改变了问题,要求SQL-92。 – 2012-02-10 08:56:06