2015-03-18 11 views
0

Я хочу сохранить последние 100 записей (lastmodifiedtime - столбец datetime) и удалить оставшиеся записи. Я изо всех сил пытаюсь получить запрос для этой цели.Удалить записи из таблицы, сохранив первые 100 записей

;WITH CTE AS 
(
SELECT TOP 100 * 
FROM [mytable] 
ORDER BY LastModifiedTime desc 
) 
    DELETE FROM CTE 
  • Этот запрос удаляет первые 100 записей. Я действительно хотел их сохранить.
+0

Вам не нужно использовать для этого цитату, см. Мой ответ. – Tanner

+0

Я отправил ответ, который показывает, как это сделать так, как вы пытались. Путь Таннера легче, но я подумал, что было бы неплохо показать вам, как его решить так же. –

ответ

3

Запрос, как это даст вам идентификаторы из последних 100 записей:

SELECT TOP 100 ID 
FROM [YOUR_TABLE] 
ORDER BY lastmodifiedtime DESC 

Так все, что вам нужно сделать, это исключено, эти идентификаторы с вашего удаления:

DELETE FROM [YOUR_TABLE] 
WHERE ID NOT IN 
     (SELECT TOP 100 Id 
     FROM [YOUR_TABLE] 
     ORDER BY lastmodifiedtime DESC) 

Просто замените ID на свое поле идентификации и [YOUR_TABLE] с именем вашей таблицы.

+0

Это сработало. Благодарю. – Venkat

0

--assuming ЕАН является уникальным ключом столбец x1

with o1 as (select Top 100 ean from x1 order by DATE1) 
delete from x1 where ean not in (select ean from o1) 
1

наклеивания с идеей КТР, вы могли бы использовать в ROW_NUMBER функцию:

WITH cte AS (
    SELECT ROW_NUMBER() OVER(ORDER BY LastModifiedTime DESC) AS RowNum 
     FROM [mytable] 
) 
DELETE FROM cte 
    WHERE RowNum > 100; 
0

никто не использовал смещение, поэтому я подумал, что я поставил бы свои два цента!

; WITH cte_Offset (
SELECT myTableID 
    FROM [myTable] 
ORDER BY LastModifiedTime Desc 
OFFSET 100 ROWS) 

DELETE 
    FROM myTable 
WHERE myTableID IN (SELECT myTableID FROM cte_Offset) 
Смежные вопросы