2011-01-26 4 views
1

je table appelée statut qui a des données comme celui-ci:Mise à jour Déclaration de requête

ID Status Number 
1 S  1 
1 p  2 
1 S  3 
1 C  4 
2 S  5 
2 R  6 

Je voulais me débarrasser des doublons dans ce tableau, donc j'ajouté une autre colonne à cette table appelée drapeau et je mis cela à 1 pour tous les records. Maintenant, ma table ressemble à ceci:

ID Status Number Flag 
1 S  1  Y 
1 p  2  Y 
1 S  3  Y 
1 C  4  Y 
2 S  5  Y 
2 R  6  Y 

Je vous écris une requête de mise à jour sur cette mise à jour de la colonne de drapeau à N si elle a des doublons et la requête de mise à jour est:

La colonne numéro est l'identité dans la table.

udate status 
set flag = 'N' 
where flag = 'Y' and Number in 
(select min(Number) from status 
where id = 1 
having count(*) >1) 

Donc, si dois-je cette requête, il me donne des données sans doublons

Select status from status 
where flag = Y 

Mais la requête de mise à jour ne fonctionne pas si j'ai 3 valeurs similaires pour le statut. La mise à jour ne fonctionne que si j'ai 2 valeurs similaires pour le statut.

Quelqu'un peut-il me suggérer un moyen de le faire?

+0

Avez-vous besoin de vous débarrasser des doublons sur 'id' ou sur (id, status) '? – Quassnoi

+0

Etes-vous en train d'essayer de mettre à jour toutes les lignes qui ont une valeur de drapeau en double à «N» ou juste le premier? – msarchet

+0

cela fonctionne-t-il si vous supprimez le 'flag = 'Y'' de la clause WHERE de votre UPDATE? –

Répondre

2

Utilisez cette option pour les doublons de drapeau uniquement (en laissant la première valeur intacte):

WITH q AS 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY id, status ORDER BY number) AS rn 
     FROM status 
     ) 
UPDATE q 
SET  flag = CASE rn WHEN 1 THEN 'Y' ELSE 'N' END 

ou ce pour marquer toutes les valeurs ayant des doublons:

WITH q AS 
     (
     SELECT *, COUNT(*) OVER (PARTITION BY id, status) AS cnt 
     FROM status 
     ) 
UPDATE q 
SET  flag = CASE cnt WHEN 1 THEN 'Y' ELSE 'N' END 
+0

Je reçois cette erreur quand j'essaie la requête ci-dessus: Msg 174, niveau 15, état 1, ligne 1 La fonction COUNT nécessite 1 argument (s). –

+0

@Sam: corrigé, mais vous devez utiliser la première requête. – Quassnoi

+0

Merci Quassnoi La première requête a travaillé –

0

Vous pouvez utiliser row_number() pour sélectionner la première ligne d'une partition particulière:

update t 
set  flag = case when rn = 1 then 'Y' else 'N' end 
from (
     select ROW_NUMBER() over (partition by status order by number) as rn 
     ,  * 
     from @t 
     ) t 
+0

Merci Andamar Cela a fonctionné –