删除重复的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

我的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       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上添加索引,运行修复程序,然后再次删除索引。也就是说,如果还没有这样一个指数的话。