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