[sql] SQL의 데이터베이스 테이블에서 상위 n 개를 제외한 모두 삭제
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-귀하의 경우에 적합한 것을 선택하십시오 .
