2011-05-08 18 views
5

Supongamos que quiero modificar la tabla de modo que mis claves principales son los siguientes¿Cómo escribo una consulta SQL para detectar claves primarias duplicadas?

user_id, round, tournament_id

Actualmente hay duplicados que tengo que limpiar. ¿Cuál es la consulta para encontrar todos los duplicados?

Esto es para MySQL y me gustaría ver las filas duplicadas

+0

¿Para qué es RDBMS? ¿Y quieres ver las filas duplicadas o solo las duplicadas? –

+0

¿Su tabla tiene actualmente alguna clave primaria? Si es así, ¿qué es? –

+0

tbh no puede tener claves primarias duplicadas –

Respuesta

8

Técnicamente, usted no necesita una consulta tales; cualquier RDBMS digno de su sal no permitirá la inserción de una fila que produciría una clave primaria duplicada en la tabla. Tal cosa viola la definición misma de una clave primaria.

Sin embargo, si usted está buscando para escribir una consulta para encontrar duplicados de estos grupos de columnas antes de la aplicación de una clave principal a la tabla que consta de estas columnas, entonces esto es lo que se quiere:

select 
    t.user_id, t.round, t.tournament_id 
from 
    table as t 
group by 
    t.user_id, t.round, t.tournament_id 
having 
    count(*) > 1 

lo anterior sólo le dará la combinación de columnas que tienen más de una fila para esa combinación, si quieres ver todas las columnas en las filas, a continuación, lleve a cabo lo siguiente:

select 
    o.* 
from 
    table as o 
     inner join (
      select 
       t.user_id, t.round, t.tournament_id 
      from 
       table as t 
      group by 
       t.user_id, t.round, t.tournament_id 
      having 
       count(*) > 1 
     ) as t on 
      t.user_id = o.user_id and 
      t.round = o.round and 
      t.tournament_id = o.tournament_id 

Tenga en cuenta que también puede crear un temporary table y unirse a eso si necesita usar los resultados varias veces.

0

Suponiendo que o bien tienen una mesa con esas tres columnas, o que se pueden hacer y rellenar una tabla con esas tres columnas, esta consulta mostrará los duplicados.

select user_id, round, tournament_id 
from yourtable 
group by user_id, round, tournament_id 
having count(*) > 1 
0

Esta consulta selecciona todas las filas de la tabla clientes que tienen un nombre duplicado, pero también muestra el correo electrónico de cada duplicado.

SELECT c.name, c.email FROM customers c, customers d 
WHERE c.name = d.name 
GROUP BY c.name, c.email 
HAVING COUNT(*) > 1 

La desventaja de esto es que usted tiene que enumerar todas las columnas que desee a la salida dos veces, una vez en el SELECT y una vez en la cláusula GROUP BY. El otro enfoque es usar una subconsulta o unir para filtrar la tabla con la lista de claves duplicadas conocidas.

Cuestiones relacionadas