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

时间:2016-04-26 09:38:40

标签: mysql sql count sql-delete having

我写了一个查询 从Table1中删除Tableid in(从Tableid组中选择Tableid,按Tableid计算(*)> 1) 但是此查询会删除计数大于1的所有数据。

有人可以通过单行查询来帮助我删除重复数据并将计数重置为1.

我有<{p>}表Table1

Tableid Count 

1        10

2        2

3        1

4        NULL

5        31

删除后应该是

Tableid Count 
1        1

2        1

3        1

4        NULL

5        1

6 个答案:

答案 0 :(得分:1)

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

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

在测试任何内容之前先备份您的数据。

答案 1 :(得分:1)

我认为这就是你要找的东西

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 * FROM @Table ORDER BY Name, Value

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我建议您在此处使用select查询,而不是delete

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

答案 4 :(得分:0)

试试这个

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

答案 5 :(得分:0)

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

它会创建一个唯一的密钥并删除重复项。

ALTER IGNORE TABLE mytable
ADD UNIQUE KEY (Tableid);