SQL의 테이블에서 모든 행을 삭제하고 n 개의 행을 맨 위에 유지하는 가장 좋은 방법은 무엇입니까?
답변:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
편집하다:
Chris는 각 행에 대해 TOP 10 쿼리가 실행되기 때문에 좋은 성능 저하를 가져옵니다. 일회성이라면 그렇게 크지 않을 수도 있지만, 일반적인 일이라면 자세히 살펴 보았습니다.
DELETE FROM Table WHERE ID NOT IN (SELECT id FROM (SELECT TOP 10 ID FROM Table) AS x)를 작성하여 MySQL 이 임시 테이블을 생성하도록하여 하위 쿼리 성능 문제를 해결할 수 있습니다 .
임시 테이블 또는 테이블 변수에 보관하려는 행 집합의 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
insert into #nuke(Nuke) ...아마도 다음과 같아야합니다. insert into #nuke(NukeID) ...또한 이러한 행을 삭제하지 않기 때문에 nuke라는 이름이 혼란 스럽습니다. nuke는 아마도 삭제된다는 사실을 따서 명명되었을 것입니다.
이것은 실제로 언어별로 다르지만 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-귀하의 경우에 적합한 것을 선택하십시오 .
TOP모든 행에 대해 표현식을 실행하지 않는 트릭이 있습니다. 우리는 결합 할 수 있습니다 TOP와 MAX얻기 위해 MaxId우리가 유지하려는합니다. 그런 다음 MaxId.
-- Declare Variable to hold the highest id we want to keep.
DECLARE @MaxId as int = (
SELECT MAX(temp.ID)
FROM (SELECT TOP 10 ID FROM table ORDER BY ID ASC) temp
)
-- Delete anything greater than MaxId. If MaxId is null, there is nothing to delete.
IF @MaxId IS NOT NULL
DELETE FROM table WHERE ID > @MaxId
참고 : 적절한 결과가 쿼리되도록 ORDER BY선언 MaxId할 때 사용하는 것이 중요합니다 .