如果SQL中有多个行重复,如何只删除几行?

时间:2017-07-05 16:34:49

标签: sql database sql-server-2008

如果多个行重复,如何只删除少量行(多于1行)?当我尝试放置条件时,所有行都被删除。我使用的是SQL Server 2008。

6 个答案:

答案 0 :(得分:1)

Delete using top command.

DELETE TOP(n) TableName
WHERE (Condition which pulls duplicate rows)
where n is the number of rows to delete.

答案 1 :(得分:0)

SQL下面会对你有帮助。

DELETE TOP(n) TableName
WHERE (Condition which pulls duplicate rows)

其中n是要删除的行数。

提示:始终尝试使用主键(主键用于唯一标识表中的每一行),因为它会对性能,可用性和可扩展性产生重大影响。整个数据库。

答案 2 :(得分:0)

使用以下查询

-- Check : This query will give you unique records 
SELECT MAX(ID)
FROM MyTable
GROUP BY Column1, Column2, Column3 ......

-- Now delete the record apart from unique record
DELETE
FROM MyTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyTable
GROUP BY Column1, Column2, Column3 ......)

注意:ID是主键。如果表中不存在ID,则首先使用AUTO_INCREMENT值创建ID,然后运行上述查询。

示例:

MyTable的

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1 
john  1    1    1    1    1    1
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

如果ID不存在,请使用自动增量值添加ID。添加ID后

ID  col1  col2 col3 col4 col5 col6 col7
1   john  1    1    1    1    1    1 
2   john  1    1    1    1    1    1
3   john  1    1    1    1    1    1
4   sally 2    2    2    2    2    2
5   sally 2    2    2    2    2    2

- 检查:此查询将为您提供唯一记录

SELECT MAX(ID) FROM MyTable
GROUP BY col1, col2, col3, col4, col5, col6, col7

查询输出     最大(ID)
    3
    5

- 现在删除独特记录

之外的记录
DELETE
FROM MyTable
    WHERE ID NOT IN
    (
     SELECT MAX(ID) FROM MyTable
     GROUP BY col1, col2, col3, col4, col5, col6, col7)

答案 3 :(得分:0)

此答案假设表中有一个主键。

写完这篇文章之后,我查看了链接的答案,可能是重复(How to delete duplicate rows in sql server?)。我更喜欢CTE方法。

创建测试数据

/* Create test data tables */
IF OBJECT_ID('tempdb.dbo.#td', 'U') IS NOT NULL
  DROP TABLE #td; 

CREATE TABLE #td ( id int identity, data int NOT NULL ) ;

INSERT INTO #td (data)
VALUES (1),(1),(2),(3),(3),(3),(1),(3)
;

我的原始

/* Test data includes dupes. */
SELECT * FROM #td ;

/* Now find and DELETE the dupes. */
DELETE FROM #td 
WHERE id IN (
    SELECT sq.id
    FROM (
        SELECT id, ROW_NUMBER() OVER ( PARTITION BY data ORDER BY (data) ) AS rn
        FROM #td
    ) sq
    WHERE sq.rn > 1
)
;

/* Dupes are gone. */
SELECT * FROM #td ;

更好

SELECT * FROM #td ; 

WITH CTE AS(
   SELECT data, RN = ROW_NUMBER()OVER(PARTITION BY data ORDER BY data)
   FROM #td
)
DELETE FROM CTE WHERE RN > 1

SELECT * FROM #td ; 

答案 4 :(得分:0)

使用delete top命令 并给出括号内的行数。 从表中删除top()

答案 5 :(得分:0)

CREATE TABLE TabStack (     col1 varchar(10),     col2 varchar(10),     col3日期 )

插入TabStack 值(

'约翰', '康纳', '01.01.1980'), ( '萨拉', '康纳', '1978年4月3日'), ( '约翰', '康纳', '1977年1月1日')

与cte 如 ( 选择col1,col2,col3,ROW_NUMBER()over(按col1分区,col2 by col3)rn 来自TabStack )

从cte中删除 其中rn> 1