2009-11-10 5 views
1

J'ai une table avec les champs suivantsmise à jour en double enregistrement

Id Name IsPublic 

je dois écrire une requête SQL qui met à jour IsPublic false où le nom a un double. Un seul des doublons devrait avoir IsPublic = true.

IsPublic est vrai par défaut

Répondre

2

Je suis ce qui suggère une approche sous-sélection:

update tableName t1 
    set IsPublic = false 
where exists(select ID 
       from tableName t2 
       where t1.name = t2.name 
       and t2.Id < t1.Id) 

Afin d'assurer exactement l'un des doubles garde son IsPublic = true, j'utilise un supplément clause where dans la sous-select: and t2.Id < t1.Id. Le doublon avec la valeur Id la plus basse conserve IsPublic = true, tandis que tous les autres enregistrements portant le même nom ont leur valeur IsPublic sur false.

1
update 
    table 
set 
    isPublic = false 
from 
    table t 
    inner join table t2 on (t.name = t2.name and t.id < t2.id) 
where 
    isPublic = true 
+0

Silencieux, cet ensemble ne sera-t-il pas IsPublic à faux pour ** tous ** les doublons? Scrippie a dit que l'un des doublons devrait avoir IsPublic = true. –

+0

Correction, merci – silent

0

devrait pourtant IsPublic à false pour tous les doublons conservant l'élément avec l'ID mininmun pour chaque groupe d'éléments avec la même valeur pour le champ Nom:

UPDATE 
    MyTable 
SET 
    isPublic = false 
WHERE 
    Id NOT IN 
    (SELECT 
      MIN(Id) 
    FROM 
      MyTable 
    GROUP BY 
      Name 
    ) 
0
declare @t table(Id int, Name varchar, IsPublic bit) 
insert into @t(Id, Name) values(1, 'a') 
insert into @t(Id, Name) values(2, 'b') 
insert into @t(Id, Name) values(3, 'b') 

update a 
set IsPublic = isnull((select 0 from @t b where a.Name = b.Name and a.id > b.id), 1) 
from @t a 

select * from @t 

enregistrement non unique id = min obtient IsPublic 1

Questions connexes