Мой вопрос аналогичен выражению sql для удаления записей старше XXX, если количество строк превышает YY , но этот вопрос касается только одного родителя, я хочу удалить записи для всех родителейза один раз.
Рассмотрим следующую таблицу:
CREATE TABLE Children
(
ChildId int NOT NULL,
ChildCreated datetime NOT NULL,
ParentId int NOT NULL
)
Это могут быть любые отношения родитель-потомок, поэтому имена являются общими.
Я хотел бы удалить всех детей старше месяца, но необходимо сохранить минимальное количество детей для каждого родителя независимо от их возраста.
Я пробовал некоторые утверждения с вложенными SELECTsи GROUP BYs, которые дали мне некоторые результаты, но ни один не дал мне правильный набор результатов.
Поскольку я использую 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 для этой проблемы?