comment mettre à jour un champ basé sur des loggings existants dans la même table

Environnement: SQL Server 2012

J'ai besoin d'aide avec une requête de maintenance pour mettre à jour les 4 null dans l'illustration suivante. J'ai aussi un sqlfiddle à regarder (édité)

Dans cet exemple, la première valeur de SideSort null doit être 7.0 car il existe un SideId existant de 1 qui a une valeur à utiliser. La seconde devrait être 8.0.

Il en va de même pour TopSort, cependant, s'il n'y a pas de TopId ou SideId existant, la valeur par défaut est 1.

entrez la description de l'image ici

Vous pouvez le faire de cette façon:

update Tracker set topSort = (select top 1 isnull(topSort, 1) from Tracker T where T.topId = Tracker.topId) where topSort is null update Tracker set sideSort = (select top 1 isnull(sideSort, 1) from Tracker T where T.sideId = Tracker.sideId) where sideSort is null 

Comme il y a plusieurs valeurs pour les mêmes topSort et sideSort , je returnne juste le top 1 dans la requête interne mais vous voudrez peut-être le replace par quelque chose qui ne returnnera qu'un seul logging.

Si le SideId n'est pas l' ID de l'logging SideSort à utiliser, la jointure est effectuée sur le même SideId. la mise à jour est:

 update t1 set t1.sidesort = coalesce(t2.sidesort,1) FROM Tracker t1 left join Tracker t2 on t2.SideId = t1.sideid and t2.SideId is not null where t1.sidesort is null update t1 set t1.topsort = coalesce(t2.topsort,1) FROM Tracker t1 left join Tracker t2 on t2.topid = t1.topid and t2.topId is not null where t1.topsort is null