2012-07-20 5 views
-1

Ceci est ma situation.Comment trouver des valeurs dupliquées dans une table associée et les mettre à jour

Tableau 1:

DOCUMENT_ID, 
GUID 

Tableau 2:

DOCUMENT_ID, 
FILE 

Les tables sont reliées par DOCUMENT_ID, ce qui signifie que TABLE2 peut avoir une ou plusieurs lignes avec le même DOCUMENT_ID.

Mon problème est que TABLE2 valeurs pour tout le groupe de DOCUMENT_ID ont les mêmes valeurs FILE.

je besoin d'une requête SQL qui va me faire tout GUID et compter le nombre de lignes dans TABLE2 pour ce DOCUMENT_ID ont exactement la même valeur FILE (pour que je puisse copier le GUID vers Excel).

Ensuite, j'ai besoin de mettre à jour TABLE2 colonnes FILE pour ces cas.

Par exemple, si DOCUMENT_ID a trois lignes TABLE2 avec la même valeur FILE, je dois mettre à jour deux d'entre eux en ajoutant un Postfix comme FILEVALUE-1, FILEVALUE-2 et ainsi de suite.

J'espère que j'ai du sens.

Merci à l'avance à tous les experts.

Répondre

1

Pour obtenir des doublons que vous pourriez employer groupe démodées par:

select table1.guid, table1.document_id, table2.[file], count(*) cnt 
    from table1 
inner join table2 
    on table1.document_id = table2.document_id 
group by table1.guid, table1.document_id, table2.[file] 
having count (*) > 1 

Pour mettre à jour directement les doublons, vous pouvez utiliser CTE:

; with t2 as (
    select id, 
      [file], 
      row_number() over (partition by document_id, [file] 
           order by id) rn 
     from table2 
) 
update t2 
    set [file] = [file] + '-' + convert(varchar(10), rn - 1) 
where t2.rn > 1 

Notez que j'ai ajouté un ID comme espace réservé pour la clé primaire. Vous avez besoin d'un moyen d'identifier un enregistrement à mettre à jour.

There is live test @ Sql Fiddle.

+0

hvala Nikola ... – no9

+0

@ no9 - Molim :-) –

0

Cela vous obtiendrez tous les fichiers qui ont plus d'un document_id

Select FILE, COUNT(DOCUMENT_ID) as DOCUMENT_ID from table2 
group by FILE 
Having count(DOCUMENT_ID)>1 
+0

Vous ne me avez pas droit. J'ai besoin de tous les GUID qui ont plus d'une valeur identique dans le champ FILE de la table connexe2. – no9

0

Vous pouvez utiliser CTE pour connaître la valeur double de TABLEAU2:

WITH CTE_1 (DOCUMENT_ID,FILE, DuplicateCount) 
AS 
(
SELECT DOCUMENT_ID,FILE, 
ROW_NUMBER() OVER(PARTITION BY DOCUMENT_ID,FILE ORDER BY DOCUMENT_ID) AS DuplicateCount 
FROM table2 
) 
select * 
FROM CTE_1 
WHERE DuplicateCount >1 
+0

belle approche, mais son ne fonctionne pas correctement. Vérifiez ce résultat: --- 41592 038125 (2) .TIF 2 --- --- 41592 038125 (2) .TIF \t 3 --- --- 41592 038125.TIF 2 --- --- 41592 038125.TIF 3 --- --- 41592 038125.TIF 4 --- ... les résultats sont "répétés" avec un nombre différent. – no9

+0

La colonne FILE est un type de varchar? –

+0

c'est .. c'est un nom de fichier – no9

0

J'ai une approche en tête, mais je ne sais pas si c'est réalisable de votre côté ou non. Mais laissez-moi vous assurer que c'est une approche très efficace. Vous pouvez créer une table ayant une colonne d'identité et insérer toutes vos données dans cette table. Et à partir de là, la manipulation des données en double est un jeu d'enfant. Il y a deux façons d'ajouter une colonne d'identité à une table avec les données existantes:

  1. Créer une nouvelle table avec l'identité, copie des données sur cette nouvelle table puis déposez la table existante puis en renommant la table temporaire.

  2. Créer une nouvelle colonne avec l'identité & déposer la colonne existante

Pour référence, le j'ai trouvé 2 articles: http://blog.sqlauthority.com/2009/05/03/sql-server-add-or-remove-identity-property-on-column/
http://cavemansblog.wordpress.com/2009/04/02/sql-how-to-add-an-identity-column-to-a-table-with-data/

Questions connexes