알고 계신대로 row_number
을 사용하는 이후 버전에서는이 작업을 매우 쉽게 수행 할 수 있습니다.
delete t from
(select ROW_NUMBER() over (order by data) r from table1) t
where r in (2,5,6)
그것도없이 내가 그 생각 SQL 서버 2000에서 사용할 수있는 생각하지 않습니다이 동일한 행
SELECT data,%%LOCKRES%%
FROM dbo.table1`
구분하는 문서화되지 않은 %%LOCKRES%%
기능을 사용할 수 있습니다.
SQL Set에는 순서가 없지만 커서가 있기 때문에 아래와 같이 사용할 수 있습니다. NB : DELETE ... WHERE CURRENT OF
을 사용할 수 있기를 기대했지만 PK를 사용하므로 행을 삭제하는 코드가 원하는만큼 간단하지 않습니다.
삭제할 데이터가 중복 된 경우 CURRENT OF
과 같은 행이 삭제된다는 보장이 없습니다. 그러나이 우발적 인 상황에서 묶인 행의 순서는 어쨌든 임의의 행이므로 어떤 행이든 삭제됩니다 도 커서 순서대로 해당 행 번호를 부여 할 수 있습니다.
DECLARE @RowsToDelete TABLE
(
rowidx INT PRIMARY KEY
)
INSERT INTO @RowsToDelete SELECT 2 UNION SELECT 5 UNION SELECT 6
DECLARE @PrevRowIdx int
DECLARE @CurrentRowIdx int
DECLARE @Offset int
SET @CurrentRowIdx = 1
DECLARE @data int
DECLARE ordered_cursor SCROLL CURSOR FOR
SELECT data
FROM dbo.table1
ORDER BY data
OPEN ordered_cursor
FETCH NEXT FROM ordered_cursor INTO @data
WHILE EXISTS(SELECT * FROM @RowsToDelete)
BEGIN
SET @PrevRowIdx = @CurrentRowIdx
SET @CurrentRowIdx = (SELECT TOP 1 rowidx FROM @RowsToDelete ORDER BY rowidx)
SET @Offset = @CurrentRowIdx - @PrevRowIdx
DELETE FROM @RowsToDelete WHERE rowidx = @CurrentRowIdx
FETCH RELATIVE @Offset FROM ordered_cursor INTO @data
/*Can't use DELETE ... WHERE CURRENT OF as here that requires a PK*/
SET ROWCOUNT 1
DELETE FROM dbo.table1 WHERE ([email protected] OR data IS NULL OR @data IS NULL)
SET ROWCOUNT 0
END
CLOSE ordered_cursor
DEALLOCATE ordered_cursor
데이터베이스 스키마가 그런식이 아닙니다. @Mitch Wheat이 말했듯이 - 당신의 * 진짜 * 시나리오를 시도해보십시오. 그렇지 않으면 우리의 삶이 어려워집니다. – RPM1984
* 기본 키가 없으면 테이블이 아닙니다! * (Joe Celko) - 기본 키를 추가하면 모든 문제가 마술처럼 사라집니다. –