删除重复的SQL表行
我的sql表没有主键列。我能找到两行,但我不知道怎样才能移到一行去休息;让我解释一下删除重复的SQL表行,sql,sql-server,Sql,Sql Server,我的sql表没有主键列。我能找到两行,但我不知道怎样才能移到一行去休息;让我解释一下 col1 col2 col3 col4 10 0 1000 1 10 0 1000 1 --> should be deleted 10 0 1111 2 --> should be deleted 10 1 1000 1 10
col1 col2 col3 col4
10 0 1000 1
10 0 1000 1 --> should be deleted
10 0 1111 2 --> should be deleted
10 1 1000 1
10 2 1000 1
15 0 1000 1
15 0 1000 1 --> should be deleted
16 0 1000 1
我使用col1和col2来理解行的复杂性。同一时间10 0必须是唯一的,但表可以包含多个10或多个0值
谢谢。这应该行得通。它首先找出每个组合有多少个重复项,然后将它们全部删除,只有一个除外
CREATE TABLE t_test (col1 int, col2 int, col3 int, col4 int)
INSERT t_test
SELECT 10, 0, 1000, 1
UNION ALL SELECT 10, 0, 1000, 1 --> should be deleted
UNION ALL SELECT 10, 0, 1111, 2 --> should be deleted
UNION ALL SELECT 10, 1, 1000, 1
UNION ALL SELECT 10, 2, 1000, 1
UNION ALL SELECT 15, 0, 1000, 1
UNION ALL SELECT 15, 0, 1000, 1 --> should be deleted
UNION ALL SELECT 16, 0, 1000, 1
DECLARE @col1 int, @col2 int, @count int
DECLARE delete_loop CURSOR LOCAL STATIC
FOR SELECT COUNT(*), col1, col2
FROM t_test
GROUP BY col1, col2
HAVING COUNT(*) > 1
OPEN delete_loop
FETCH NEXT FROM delete_loop INTO @count, @col1, @col2
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE TOP (@count - 1)
FROM t_test
WHERE col1 = @col1
AND col2 = @col2
FETCH NEXT FROM delete_loop INTO @count, @col1, @col2
END
CLOSE delete_loop
DEALLOCATE delete_loop
SELECT * FROM t_test
编辑:调整为只查看col1和col2的唯一性。这里有一个简单的方法来识别重复项并删除它们 添加一个id,该id根据col1和col2分区的每个组合递增,将其包装在CTE中,并删除第一次出现时不等于1的记录
DECLARE @Test TABLE (col1 int, col2 int, col3 int, col4 int)
INSERT @Test
SELECT 10, 0, 1000, 1
UNION ALL SELECT 10, 0, 1000, 1 --> should be deleted
UNION ALL SELECT 10, 0, 1111, 2 --> should be deleted
UNION ALL SELECT 10, 1, 1000, 1
UNION ALL SELECT 10, 2, 1000, 1
UNION ALL SELECT 15, 0, 1000, 1
UNION ALL SELECT 15, 0, 1000, 1 --> should be deleted
UNION ALL SELECT 16, 0, 1000, 1
;WITH DUPES
AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY COL1,COL2 ORDER BY COL1,COL4) AS myID
FROM @Test
)
DELETE D
FROM DUPES D
WHERE myID <> 1
SELECT *
FROM @Test
我的第一个想法是:添加一个自动递增id,然后用它来删除重复的id。您使用的是什么SQL?MySQL,PostgreSQL,MSSQL,Oracle,…@user2672165实际上我是在网上搜索才问的。但许多示例在列中有一个不同的值。我的怀疑有时是完全一样的。我必须匹配第1列和第2列。好的,我可以调查这些主题并通知您。参考问题都有一个“额外”id列,这里似乎缺少该列,使其解决方案不适用。成功运行。谢谢您的解决方案@derobyYou's welcome。如果速度太慢,可以先在col1和col2上添加索引,运行修复程序,然后再次删除索引。也就是说,如果还没有这样一个指数的话。