如何按 SQL 中的行号删除
How to delete by row number in SQL
我需要从第 475 行到第 948 行删除,因为它们与第 1-474 行重复。我想它应该接近于此,或者还有更多?
DELETE FROM dbo.industry WHERE row_number between 475 and 948
SELECT DISTINCT *
INTO #Temp
FROM dbo.industry
DELETE FROM dbo.industry
INSERT INTO dbo.industry
SELECT *
FROM #Temp
DELETE FROM dbo.industry
WHERE COLUMN_NAME IN -- Choose a column name
(SELECT TOP 1000
COLUMN_NAME, -- Choose a column name
ROW_NUMBER() OVER( ORDER by COLUMN_NAME ASC) AS Row_Number
FROM dbo.industry
WHERE Row_Number BETWEEN 475 AND 948 )
COLUMN_NAME 可以是您想要的 table 的任何列名称。
DELETE FROM dbo.industry WHERE dbo.industry.
REPLACE WITH PK COLUMN NAME| IN (SELECT TOP 948 dbo.industry
REPLACE WITH PK COLUMN NAME| FROM dbo.industry WHERE dbo.industry
REPLACE WITH PK COLUMN NAME| > 475 ORDER BY dbo.industry
REPLACE WITH PK COLUMN NAME|)
这不是真正的答案。数据存在一些问题,使上述答案(虽然很好)无关。我只是删除了 table 然后从固定宽度重新导入它。这一次,我更加小心,没有重复。
可能为时已晚,但我通常这样做
; with cte(rownum)as(
select row_number () over(partition by [Col1], [Col2] order by Col3) from [table]
)
delete from cte where rownum > 1
如果您尝试使用 Row_Number
函数进行删除,并且出现
错误
Windowed functions can only appear in the SELECT or ORDER BY clauses
您可以修改 SQL 以将其包含在 select 子句中,如下例所示:
Delete T
From (Select Row_Number() Over(Partition By [IndustryType], [IndustryDescription] order By [ID]) As RowNumber,*
From dbo.industry) T
Where T.RowNumber > 1
ALTER TABLE dbo.industryADD COLUMN tmpRowNumber COUNTER
DELETE * FROM dbo.industry WHERE tmpRowNumber IS BETWEEN 475 AND 948
ALTER TABLE dbo.industry DROP COLUMN tmpRowNumber
不过要小心,您的 DBS 可能不会将第 1 行视为第 1 行,因为表格未排序
我需要从第 475 行到第 948 行删除,因为它们与第 1-474 行重复。我想它应该接近于此,或者还有更多?
DELETE FROM dbo.industry WHERE row_number between 475 and 948
SELECT DISTINCT *
INTO #Temp
FROM dbo.industry
DELETE FROM dbo.industry
INSERT INTO dbo.industry
SELECT *
FROM #Temp
DELETE FROM dbo.industry
WHERE COLUMN_NAME IN -- Choose a column name
(SELECT TOP 1000
COLUMN_NAME, -- Choose a column name
ROW_NUMBER() OVER( ORDER by COLUMN_NAME ASC) AS Row_Number
FROM dbo.industry
WHERE Row_Number BETWEEN 475 AND 948 )
COLUMN_NAME 可以是您想要的 table 的任何列名称。
DELETE FROM dbo.industry WHERE dbo.industry.
REPLACE WITH PK COLUMN NAME| IN (SELECT TOP 948 dbo.industry
REPLACE WITH PK COLUMN NAME| FROM dbo.industry WHERE dbo.industry
REPLACE WITH PK COLUMN NAME| > 475 ORDER BY dbo.industry
REPLACE WITH PK COLUMN NAME|)
这不是真正的答案。数据存在一些问题,使上述答案(虽然很好)无关。我只是删除了 table 然后从固定宽度重新导入它。这一次,我更加小心,没有重复。
可能为时已晚,但我通常这样做
; with cte(rownum)as(
select row_number () over(partition by [Col1], [Col2] order by Col3) from [table]
)
delete from cte where rownum > 1
如果您尝试使用 Row_Number
函数进行删除,并且出现
Windowed functions can only appear in the SELECT or ORDER BY clauses
您可以修改 SQL 以将其包含在 select 子句中,如下例所示:
Delete T
From (Select Row_Number() Over(Partition By [IndustryType], [IndustryDescription] order By [ID]) As RowNumber,*
From dbo.industry) T
Where T.RowNumber > 1
ALTER TABLE dbo.industryADD COLUMN tmpRowNumber COUNTER
DELETE * FROM dbo.industry WHERE tmpRowNumber IS BETWEEN 475 AND 948
ALTER TABLE dbo.industry DROP COLUMN tmpRowNumber
不过要小心,您的 DBS 可能不会将第 1 行视为第 1 行,因为表格未排序