2009-08-03 15 views
41

MS Access dispone di un pulsante per generare il codice SQL per la ricerca di righe duplicate. Non so se SQL Server 2005/2008 Managment Studio ha questo.Come ottenere il codice T-SQL per trovare i duplicati?

  1. In caso affermativo, si prega di indicare dove

  2. Se non lo è, la prego di dirmi come posso avere un aiutante T-SQL per la creazione di codice come questo.

risposta

107

Beh, se avete intere righe come duplicati nella tabella, hai almeno non ha una chiave primaria impostato per quel tavolo, altrimenti almeno il valore della chiave primaria sarebbe stato diverso.

Tuttavia, qui è come costruire uno SQL per ottenere i duplicati su un set di colonne:

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

Ciò trovare le righe che per colonne col1-col4, ha la stessa combinazione di valori, più di una volta .

Ad esempio, nella seguente tabella, righe 2 + 3 sarebbero duplicati:

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

Le due righe condividono valori comuni nelle colonne col1-col4, e quindi, per quel SQL, è considerato duplicati. Espandi l'elenco di colonne per contenere tutte le colonne per le quali desideri analizzare questo.

+0

Si ha un punto, perché il codice non è così difficile come mi aspettavo . In altri linguaggi SQL può essere difficile codificare manualmente –

+3

Non dovrebbe essere, questo è SQL standard, niente di specifico per T-SQL. Dovrebbe essere lo stesso per MySQL, SQLite, Oracle, Sybase, DB2, ecc. –

+0

Hai ragione. La mancanza di evidenziazione della sintassi e di codice rumoroso mi ha fatto credere che il codice generato da MS Access fosse difficile da capire e non l'ho nemmeno provato prima. –

2

AFAIK, non è così. È sufficiente creare un raggruppamento di istruzioni select in base a tutti i campi di una tabella e filtrare utilizzando una clausola having dove il conteggio è maggiore di 1.

Se le righe sono duplicate tranne che dalla chiave, non includere la chiave in i campi selezionati.

51

Se stai usando SQL Server 2005 +, è possibile utilizzare il seguente codice per vedere tutte le righe insieme ad altre colonne:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 

Youd può anche eliminare (o in altro modo lavorare con) duplicati utilizzando questo tecnica:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER è estremamente potente - c'è molto che si può fare con esso - vedi l'articolo su di esso a BOL http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1 per istruirci su come eliminare. Inoltre, lo snippet include anche il PK. /necro – theTuxRacer

+0

questo dovrebbe essere votato per top1 – SQueek

+0

Un altro vantaggio è che sembra correre più veloce del gruppo dagli approcci che ho visto. –

5

ho trovato questo sol ution quando ho bisogno di scaricare intere righe con uno o più campi duplicati, ma io non voglio scrivere ogni nome di campo nella tabella:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
Problemi correlati