Как найти повторяющиеся записи перед созданием УНИКАЛЬНОГО ключа?

Я собираюсь создать ключ UNIQUE в большой старой таблице (несколько сотен тысяч строк), чтобы обеспечить соблюдение каждой строки, содержащей уникальные данные. Я не могу просто создать индекс, потому что таблица уже содержит дубликаты. Я не знаю, сколько дубликатов он содержит и нужны ли дубликаты. Короче говоря, я не могу проанализировать проблему, пока не придумаю запрос, который выбирает все строки, которые нарушают будущий ключ UNIQUE.

Скажем, у меня есть таблица с полями col_one, col_two, col_three и col_four. Мой будущий ключ UNIQUE будет содержать col_two и col_three. Как выбрать все строки в таблице, в которых col_two и col_three есть дубликаты в одной и той же таблице?


person Hubro    schedule 18.03.2013    source источник
comment
Вы можете прокрутить это, чтобы найти повторяющиеся записи в столбце. stackoverflow.com/questions/854128/   -  person Dead Man    schedule 18.03.2013


Ответы (1)


Используйте группу.

SELECT 
  col_two,
  col_three,
  COUNT (*) AS `num_dupes`
FROM
  your_table
GROUP BY
  col_two,
  col_three
HAVING 
  COUNT(*) > 1 -- Only return results where there is at least one duplicate.

Если вы хотите увидеть все результаты из вашей таблицы, в которых существуют дубликаты, вы можете просто присоединиться к этим результатам в таблице:

SELECT
  your_table.*
FROM
  your_table
    INNER JOIN 
    (SELECT 
      col_two,
      col_three,
      COUNT (*) AS `num_dupes`
    FROM
      your_table
    GROUP BY
      col_two,
      col_three
    HAVING 
      COUNT(*) > 1) dupes 
      ON your_table.col_two = dupes.col_two AND
         your_table.col_three = dupes.col_three
person Matt Gibson    schedule 18.03.2013
comment
Можно ли выбрать все повторяющиеся строки, не группируя их? В случае, если я хочу изучить разницу в столбцах, которые не включены в ключ UNIQUE. Возможно, мне нужно было бы включить язык программирования на этом этапе. - person Hubro; 19.03.2013
comment
Вы можете довольно легко сделать это, связав другой запрос на основе результатов этого запроса. Я добавлю это к своему ответу. - person Matt Gibson; 19.03.2013