我想要一个从我的数据库中删除重复条目的查询

I want a single query that deletes duplicate entry from my database

我写了一个查询 delete from Table1 where Tableid in(select Tableid from Table1 group by Tableid having count(*) >1) 但是这个查询删除了所有计数大于 1 的数据。

谁能帮我删除重复数据并将计数重置为 1 的单行查询。

我有 table Table1

Tableid Count 

1        10

2        2

3        1

4        NULL

5        31

Post删除应该是

Tableid Count 
1        1

2        1

3        1

4        NULL

5        1

  1. 按字母顺序或数字顺序对数据进行排序。
  2. 检查当前字段是否等于上一个字段。
  3. 相同则删除

要删除所有重复数据:将可能具有相同数据的列分组。

DELETE FROM table 
WHERE id IN (SELECT id FROM table GROUP BY column HAVING COUNT(column) > 1)

要删除重复项并保留其中之一:从重复项和分组列中获取至少 (1) 条数据。

DELETE t1 FROM table t1, table t2 
WHERE t1.id <> t2.id AND t1.column = t2.column

在测试任何东西之前先备份你的数据。

我建议在这里使用 select 查询而不是 delete

select tableId,case when count >1 then (count-(count-1)) 
                    else count
               end as count
from table 1;

试试这个

 DELETE FROM Table1 
       WHERE Tableid IN (SELECT Tableid FROM Table1 GROUP BY Tableid HAVING COUNT(*) > 1)

您还可以在字段上设置唯一键,使用 KEYWORD IGNORE 使行成为唯一键。

它将创建一个唯一键并直接删除重复项。

ALTER IGNORE TABLE mytable
ADD UNIQUE KEY (Tableid);

我想这就是您要找的

DECLARE @Table TABLE 
(   
    Name VARCHAR(20),
    Value INT 
);

;WITH T AS (
    SELECT CONCAT('a',1) AS Name, 1 AS Value 
    UNION ALL
    SELECT CONCAT('a',T.Value + 1) AS Name, T.Value + 1 FROM T
    WHERE T.Value < 5
)
INSERT INTO @Table 
SELECT T.Name ,
       T.Value 
FROM T


INSERT INTO @Table
        ( Name, Value )
VALUES  ( 'a5', -- Name - varchar(20)
          5  -- Value - int
          ),( 'a5', -- Name - varchar(20)
          5  -- Value - int
          )

INSERT INTO @Table
SELECT * FROM @Table

INSERT INTO @Table
SELECT * FROM @Table

SELECT 
    COUNT(*) AS TotalCount
    , Name 
    , Value 
FROM 
    @Table 
GROUP BY 
    Name ,
    Value 
ORDER BY 
    Name



DELETE T 
FROM (
    SELECT 
        Name 
        , Value
        , ROW_NUMBER() OVER(PARTITION BY Name, Value ORDER BY Value) AS RN
    FROM 
        @Table
) AS T
WHERE T.RN > 1


SELECT COUNT(*) AS TotalCount, Name, Value 
FROM @Table 
GROUP BY Name, Value
ORDER BY Name, Value