2017-10-06 39 views
1

我需要从行号475至948中删除,因为它们是行1-474的重复项。我认为这将是接近这一点的东西,还是有更多呢?如何通过SQL中的行号删除

DELETE FROM dbo.industry WHERE row_number between 475 and 948 
+0

你有一个主键,就像在数据库中的ID的东西吗?如果你这样做,你可以很容易地删除ID。 –

+1

'row_number'是表中的一列吗?该列中的值是475-948是您想要删除的行吗? – David

+0

@MichaelPlatt,我有一个由9个字段组成的复合主键。 –

回答

0

这不是一个真正的答案。数据中出现了一些问题,使得上面的答案(虽然优秀)无关。我只是删除了表格,然后从固定宽度重新导入它。这一次,我更加小心,没有重复。

0
SELECT DISTINCT * 
INTO #Temp 
FROM dbo.industry 

DELETE FROM dbo.industry 

INSERT INTO dbo.industry 
SELECT * 
FROM #Temp 
+1

在上面的注释中,OP指示该表具有主键。所以这是行不通的。每条记录都将被重新插入。 – David

+0

同意,但这种方法可以很容易地进行调整,以考虑到这一点。重点在于,找到不同的值并重新创建它比替换行号匹配更有意义。 – BelgoCanadian

+0

这就是问题所在......如何定位“不同的”记录。删除它们的行为不是问题。这是一个很好的尝试,但基本上你是在挥手去解决实际问题。 – David

1
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可以是你的表的任何列名u想要的。

0
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|) 
0

可能为时已晚,但我通常这样做

; with cte(rownum)as(
    select row_number() over(partition by [Col1], [Col2] order by Col3) from [table] 
) 
delete from cte where rownum > 1