2010-01-28 15 views
5

Uno dei la domanda posta in un'intervista era,singola query da cancellare e visualizzare i record duplicati

Una tabella ha 100 record. 50 di loro sono duplicati. È possibile con una singola query eliminare i record duplicati dalla tabella e selezionare e visualizzare i restanti 50 record.

Ciò è possibile in una singola query SQL?

Grazie

SNA

+0

perché si vuole/bisogno di fare questo? –

+1

Probabilmente dipende dal motore del database ma con SQL Server è definitivamente possibile. –

+2

Oracle, server Microsoft SQL, mysql o altro? si prega di specificare – kurast

risposta

6

con SQL Server si può usare qualcosa di simile

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 

Il OUTPUT dichiarazione mostra i record che vengono eliminati.

Aggiornamento:

Sopra query eliminare i duplicati e vi consegnerà le righe che vengono eliminati, non le righe che rimangono. Se questo è importante per te (tutto sommato, le restanti 50 righe dovrebbero essere identiche alle 50 righe eliminate), potresti usare la sintassi SQL Server's 2008 MERGE per raggiungere questo obiettivo.

+1

Mi piace il fatto che tu abbia mostrato chiaramente come farlo, mentre le persone con 4 e 10 volte il tuo rappresentante stanno dicendo che non è possibile. – cjk

+0

Mostra semplicemente che nessuno è * (onmisciente) (omsincient) (omniciente) * ... sa tutto. –

+0

+1 Wow, ho già imparato qualcosa di nuovo oggi ed è ancora mattina. :) –

0

Suoni improbabile, almeno in ANSI SQL, dal momento che una eliminazione restituisce solo il conteggio del numero di righe eliminate.

1

Lieven's Answer è una buona spiegazione di come generare le righe eliminate. Mi piacerebbe aggiungere due cose:

  1. Se si vuole fare qualcosa di più con l'uscita diversa visualizzazione, è possibile specificare OUTPUT INTO @Tbl (dove @Tbl è un tavolo-var si dichiara prima del soppresso)

  2. L'utilizzo di MAX, MIN o uno qualsiasi degli altri aggregati può gestire solo una riga duplicata per gruppo. Se è possibile per voi di avere molti duplicati, il seguente codice di SQL Server 2005 + contribuirà a farlo:

 

;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 
) 
Problemi correlati