SQL의 테이블에서 모든 행을 삭제하고 n 개의 행을 맨 위에 유지하는 가장 좋은 방법은 무엇입니까?
답변
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
편집하다:
Chris는 각 행에 대해 TOP 10 쿼리가 실행되기 때문에 좋은 성능 저하를 가져옵니다. 일회성이라면 그렇게 크지 않을 수도 있지만, 일반적인 일이라면 자세히 살펴 보았습니다.
답변
임시 테이블 또는 테이블 변수에 보관하려는 행 집합의 ID 열을 선택합니다. 그런 다음 임시 테이블에 존재하지 않는 모든 행을 삭제하십시오. 다른 사용자가 언급 한 구문 :
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
잠재적 인 문제가 있습니다. 테이블의 각 행에 대해 “SELECT TOP 10″쿼리가 실행되므로 성능이 크게 저하 될 수 있습니다. 동일한 쿼리를 반복해서 작성하지 않으려 고합니다.
이 구문은 원래 SQL 문으로 나열한 내용에 따라 작동합니다.
create table #nuke(NukeID int)
insert into #nuke(Nuke) select top 1000 id from article
delete article where not exists (select 1 from nuke where Nukeid = id)
drop table #nuke
답변
MS SQL을 사용하지 않는 사용자를위한 향후 참조.
PostgreSQL의에서 사용 ORDER BY
하고 LIMIT
대신 TOP
.
DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
MySQL-음 …
오류 -이 버전의 MySQL은 아직 ‘LIMIT & IN / ALL / ANY / SOME 하위 쿼리’를 지원하지 않습니다.
아직은 아닌 것 같아요.
답변
가상 테이블을 사용하는 것이 IN 절 또는 임시 테이블보다 훨씬 낫다고 생각합니다.
DELETE
Product
FROM
Product
LEFT OUTER JOIN
(
SELECT TOP 10
Product.id
FROM
Product
) TopProducts ON Product.id = TopProducts.id
WHERE
TopProducts.id IS NULL
답변
답변
이것은 실제로 언어별로 다르지만 SQL 서버에 대해 다음과 같은 것을 사용할 것입니다.
declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10 ) FROM dTable
정확한 행 수에 신경 쓰지 않으면 항상
DELETE TOP 90 PERCENT FROM dTABLE;
답변
내가 한 방법은 다음과 같습니다. 이 방법은 더 빠르고 간단합니다.
OFFSET 명령을 사용하여 MS SQL의 데이터베이스 테이블에서 상위 n 개를 제외한 모두 삭제
WITH CTE AS
(
SELECT ID
FROM dbo.TableName
ORDER BY ID DESC
OFFSET 11 ROWS
)
DELETE CTE;
ID
정렬하려는 열로 바꿉니다 . 다음 OFFSET
번호를 삭제할 행 수로 바꿉니다 . DESC
또는 ASC
-귀하의 경우에 적합한 것을 선택하십시오 .