Мой вопрос похож на оператор sql для удаления записей старше XXX, если строк больше, чем YY, но этот вопрос просто имеет дело с одним родителем, я хочу удалить записи для всех родителей за один раз.
Рассмотрим эту таблицу:
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 для этой проблемы?