Переименование дубликатов данных в sql - PullRequest
6 голосов
/ 14 сентября 2011

Я могу найти дубликаты данных, используя этот запрос

   SELECT names FROM group GROUP BY names HAVING count(*) > 1

Я могу получить дубликаты данных. Мне просто нужно знать, как переименовать эти дубликаты с именем на new

  INPUT
+-----------------+               
| names           |
+-----------------+
| text1           |
| text2           |
| text3           |
| text1           |
| text3           |
| text4           |
+-----------------+

OUTPUT  
+-----------------+
| names           |
+-----------------+ 
| text1           |
| text2           |
| text3           |
| text1 new value |->RENAMED
| text3 new value |->RENAMED
| text4           |
+-----------------+

Ответы [ 3 ]

13 голосов
/ 14 сентября 2011

Предполагая, что у вас есть некоторый первичный ключ в таблице, например, идентификатор с автоматическим приращением, вы можете сделать следующее:

UPDATE group 
SET names = CONCAT(names,' Copy 1')
WHERE ID IN
(
SELECT MAX(ID) 
FROM group 
GROUP BY names 
HAVING count(*) > 1
);

Чтобы объяснить, он найдет что-нибудь с дубликатом, возьмитеМаксимальный идентификатор для чего-либо в этом наборе, и добавьте «копия 1» в конце этого.У вас могут остаться дубликаты, если у вас были определенные имена 3 или более раз.Просто запустите его снова, на этот раз с «копировать 2» вместо «копировать 1».Продолжайте повторять этот процесс, пока не избавитесь от всех дубликатов.

Обновление.Чтобы позаимствовать идею у @Yahia и использовать UUID, вы можете сделать следующее, если хотите сделать все это одним запросом.

UPDATE group 
SET names = CONCAT(names, CONCAT ( ' Copy ', UUID_SHORT() ) )
WHERE 
ID NOT IN
(
SELECT MIN(ID) 
FROM group 
GROUP BY names 
HAVING count(*) > 1
) AND
ID IN
(
SELECT ID
FROM group AS G1
INNER JOIN group AS G2
ON G1.names = G2.names AND G1.ID <> G2.ID
);
2 голосов
/ 14 сентября 2011

использование (исправлено согласно комментарию)

UPDATE Group 
SET Names = CONCAT(Names, CONCAT ( ' Copy ', UUID_SHORT() ) )
WHERE 
ID NOT IN
(
SELECT MIN(ID) 
FROM group 
GROUP BY names 
HAVING count(*) > 1
) AND
ID IN
(
SELECT ID
FROM group 
GROUP BY names 
HAVING count(*) > 1
);

это делает все дубликаты уникальными с одним выполнением, объединяя уникальный UUID_SHORT ... кроме одного с наименьшим идентификатором - он остается нетронутым ...

1 голос
/ 14 сентября 2011

Попробуйте это -

UPDATE table1 n 
  JOIN (SELECT names FROM table1 GROUP BY names HAVING count(*) > 1) d
    ON n.names = d.names
SET n.names = 'new value';

РЕДАКТИРОВАТЬ:

Полный код -

CREATE TABLE table1(
  id INT(11) PRIMARY KEY AUTO_INCREMENT,
  names VARCHAR(255) DEFAULT NULL
);    

INSERT INTO table1 VALUES 
  ('text1'),
  ('text2'),
  ('text3'),
  ('text1'),
  ('text3'),
  ('text4');

UPDATE table1 n 
  JOIN (SELECT names, MIN(id) min_id FROM table1 GROUP BY names HAVING COUNT(*) > 1) d
    ON n.names = d.names AND n.id <> d.min_id
SET n.names = CONCAT(n.names, ' new value');

SELECT * FROM table1;

+----+-----------------+
| id | names           |
+----+-----------------+
|  1 | text1           |
|  2 | text2           |
|  3 | text3           |
|  4 | text1 new value |
|  5 | text3 new value |
|  6 | text4           |
+----+-----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...