2010-01-28 11 views
5

Uno de la pregunta planteada en una entrevista era,sola consulta a eliminar y visualizar registros duplicados

Una tabla tiene 100 registros. 50 de ellos son duplicados. ¿Es posible con una sola consulta eliminar los registros duplicados de la tabla, así como seleccionar y mostrar los 50 registros restantes?

¿Esto es posible en una sola consulta SQL?

Gracias

SNA

+0

¿Por qué quieres/necesidad de hacer esto? –

+1

Probablemente dependa del motor de base de datos pero con SQL Server es definitivamente posible. –

+2

Oracle, Microsoft SQL server, mysql u otro? por favor especifique – kurast

Respuesta

6

con SQL Server que usaría algo como esto

DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER) 

INSERT INTO @Table VALUES (1, 100) 
INSERT INTO @Table VALUES (2, 100) 
INSERT INTO @Table VALUES (3, 200) 
INSERT INTO @Table VALUES (4, 200) 

DELETE FROM @Table 
OUTPUT Deleted.* 
FROM @Table t 
     INNER JOIN (
     SELECT ID = MAX(ID) 
     FROM  @Table 
     GROUP BY PossibleDuplicate 
     HAVING COUNT(*) > 1 
    ) d ON d.ID = t.ID 

La declaración OUTPUT muestra los registros que se eliminan.

Actualización:

Por encima de consulta será eliminar duplicados y le dará las filas que se eliminan, no las filas que quedan. Si eso es importante para usted (en general, las 50 filas restantes deben ser idénticas a las 50 filas eliminadas), puede usar la sintaxis SQL Server's 2008 MERGE para lograr esto.

+1

Me gusta el hecho de que haya mostrado claramente cómo hacerlo, mientras que las personas con 4 y 10 veces su representante dicen que no es posible. – cjk

+0

Solo muestra que nadie es * (onmiscient) (omsincient) (omnicsient) * ... lo sabe todo. –

+0

+1 Guau, ya aprendí algo nuevo hoy y todavía es de mañana. :) –

0

Suena poco probable, al menos en ANSI SQL, ya que una eliminación sólo devuelve el recuento del número de registros borrados.

1

Lieven's Answer es una buena explicación de cómo generar las filas eliminadas. Me gustaría añadir dos cosas:

  1. Si quieres hacer algo más con la salida que no sea la visualización, puede especificar OUTPUT INTO @Tbl (donde @Tbl es una tabla-var se declara antes de la suprimido);

  2. Uso de MAX, MIN, o cualquiera de los otros agregados sólo puede manejar una fila duplicado por grupo. Si es posible para usted tener muchos duplicados, el siguiente código SQL Server 2005 + nos ayudará a lograrlo:

 

;WITH Duplicates AS 
(
    SELECT 
     ID, 
     ROW_NUMBER() OVER (PARTITION BY DupeColumn ORDER BY ID) AS RowNum 
) 
DELETE FROM MyTable 
OUTPUT deleted.* 
WHERE ID IN 
(
    SELECT ID 
    FROM Duplicates 
    WHERE RowNum > 1 
) 
Cuestiones relacionadas