我想要一个从我的数据库中删除重复条目的查询
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
- 按字母顺序或数字顺序对数据进行排序。
- 检查当前字段是否等于上一个字段。
- 相同则删除
要删除所有重复数据:将可能具有相同数据的列分组。
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
我写了一个查询 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
- 按字母顺序或数字顺序对数据进行排序。
- 检查当前字段是否等于上一个字段。
- 相同则删除
要删除所有重复数据:将可能具有相同数据的列分组。
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