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
다른 맛에 대해서는 모르지만 MySQL DELETE 는 LIMIT를 허용합니다.
유지하려는 n 행이 맨 아래에 있도록 주문할 수 있다면 DELETE FROM table LIMIT tablecount-n을 수행 할 수 있습니다.
편집하다
Oooo. 나는 Cory Foy의 대답이 귀하의 경우에 효과가 있다고 가정하면 더 좋아한다고 생각합니다. 내 방식은 비교해 보면 약간 투박하다.
이것은 실제로 언어별로 다르지만 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
-귀하의 경우에 적합한 것을 선택하십시오 .
아래 기술을 사용하여 해결할 것입니다. 이 예 에서는 각 행에 ID가 있는 기사 테이블이 필요합니다 .
Delete article where id not in (select top 1000 id from article)
편집 : 내 질문에 너무 느리게 대답하기 ...
리팩토링?
Delete a From Table a Inner Join (
Select Top (Select Count(tableID) From Table) - 10)
From Table Order By tableID Desc
) b On b.tableID = A.tableID
편집 : 쿼리 분석기에서 둘 다 시도해 보았습니다. 현재 답변은 금식입니다 (젠장 ...)
Better way would be to insert the rows you DO want into another table, drop the original table and then rename the new table so it has the same name as the old table
참고URL : https://stackoverflow.com/questions/46385/delete-all-but-top-n-from-database-table-in-sql
'your programing' 카테고리의 다른 글
ConfigureServices 메서드에서 IHostingEnvironment 액세스 (0) | 2020.10.12 |
---|---|
MSIL과 Java 바이트 코드의 차이점은 무엇입니까? (0) | 2020.10.12 |
C ++에서 big int를 구현하는 방법 (0) | 2020.10.12 |
JAX-RS / Jersey를 사용하는 이유는 무엇입니까? (0) | 2020.10.12 |
React 컴포넌트를 동적으로 렌더링 (0) | 2020.10.12 |