2013-07-22 3 views
13

Ho una tabella che ha ottenuto una colonna con valori duplicati. Vorrei aggiornare uno dei 2 valori duplicati, ad esempio, row1 = tom e row2 = tom. Voglio aggiungere un 1 o un a uno di essi e questo sarà per molti altri duplicati nella stessa colonna. Fondamentalmente basta aggiungere un numero o una lettera a ogni 1 dei duplicati in modo che non ci siano più duplicati.Aggiornare uno dei 2 duplicati in una tabella di database del server sql

Ho questa query che aggiornerà tutti i duplicati ma non uno di essi. Qualcuno può aiutare?

UPDATE Table1 
    SET Column1 = 'a' 
WHERE exists 
     (SELECT Column1 , COUNT(Column1) 
FROM Clients 
GROUP BY Column1 
HAVING (COUNT(Column1) > 1) 
) 
+0

Se è un record duplicato perché è necessario tenerlo? c'è una ragione specifica per farlo? –

+0

Che aspetto ha il tuo schema? Qualunque chiave primaria con cui lavorare? –

+0

Ne ho bisogno perché è una informazione preziosa. Non voglio cancellarne nessuna. Voglio solo distinguerli per scopi di analisi dei dati. Sì, ho un ID che è una chiave primaria. – MohammedT

risposta

31

Try This con CTE e PARTITION BY

;WITH cte AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column1) AS rno, 
     Column1 
    FROM Clients 
) 

UPDATE cte SET Column1 =Column1 +' 1 ' 
WHERE rno=2 
+1

down voter per favore spiega il motivo – Nithesh

+1

Ottima soluzione - grazie! –

3

assumere Table1, contenente le seguenti informazioni:

Column1  
======== 
tom   
john 
jack  
tom  
james 
jane 

noti che la prima e la quarta fila sono identici. Ecco il comando UPDATE per cambiare il nome in uno solo di essi.

UPDATE Table1 AS t1 
    SET Column1 = 'jennifer' 
WHERE rrn(t1) = 
     (SELECT MAX(rrn(t2)) 
      FROM Table1 AS t2 
     WHERE Column1 = 'tom') 

E il risultato sarebbe

Column1  
======== 
tom   
john 
jack  
jennifer 
james 
jane 

con RRN funzione è possibile aggiornare l'ultima occorrenza di record duplicato

+0

Questo cambierà qualsiasi tom in una che non voglio. Ho ottenuto un grande dato e quella colonna ha molti duplicati. Tutto quello che voglio è aggiungere una lettera o un numero incrementale alla fine di uno dei duplicati piuttosto che farlo manualmente. – MohammedT

+0

Si rifiuta di accettare AS t1 dopo l'aggiornamento. Perché è così? – MohammedT

+0

Sintassi errata vicino a 'AS' Previsto SET ... Questo è l'errore – MohammedT

0

Prova questa compagno

UPDATE Table1 
SET Column1 = column1 +'a' 
WHERE exists(
     select row 
     from (
      SELECT 
       Column1 , 
       Row_Number() over(Partition by Column1 order by Column1) as row 
      FROM Clients 
     ) as subquery 
     where subquery.row = 2 
    ) 
+1

Aggiornamento di tutte le righe. Intendo tutte le righe duplicate – Romesh

4

penso che questo semplice aggiornamento è quello che stai cercando;

UPDATE Table1 SET Column1=Column1+CAST(id AS VARCHAR) 
WHERE id NOT IN (
    SELECT MIN(id) 
    FROM Table1 
    GROUP BY Column1 
); 

ingresso:

(1,'A'), 
(2,'B'), 
(3,'A'), 
(4,'C'), 
(5,'C'), 
(6,'A'); 

uscita:

(1,'A'), 
(2,'B'), 
(3,'A3'), 
(4,'C'), 
(5,'C5'), 
(6,'A6'); 

An SQLfiddle to test with.

+0

che accodano l'id è una buona idea. Molto bene! +1 – zkanoca

2

Penso che si possa utilizzare TOP() operatore al posto di row_number() metodo che vi aiuterà ad aggiornare uno in modo facile e semplice

UPDATE TOP (1)Table1 SET Column1 = 'a'; 
+0

Si prega di essere sicuri delle vostre risposte. Di solito "penso" in una risposta renderà meno probabile la tua risposta. – ObieMD5

+0

Questa è la migliore risposta. Usa lo strumento corretto dall'applicazione e non è una soluzione alternativa. (Funziona anche - ha appena risolto il problema che ho avuto.) – ColinMac

0

Ho dovuto inserire il con dentro da poiché il mio sviluppatore sql non ha gradito l'aggiornamento con Copia dalla risposta di Nithesh

ha un aspetto simile al seguente:

UPDATE Clients 
SET Column1 = 'a' 
WHERE ColumnID IN (select ColumnID from 
( 
SELECT 
     row_number() OVER(PARTITION BY Column1 ORDER BY Column1) AS rno, 
     ColumnID FROM Clients 
) 
        where rno=2 
       ) 
Problemi correlati