Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation d'une colonne d'ordre de tri dans une table de base de données

Update product set order = order+1 where order >= @value changed

Bien qu'avec le temps, vous obtiendrez des "espaces" de plus en plus grands dans votre commande, mais cela "triera" toujours

Cela ajoutera 1 à la valeur modifiée et à toutes les valeurs qui la suivent dans une instruction, mais l'instruction ci-dessus est toujours vraie. des "espaces" de plus en plus grands se formeront dans votre commande, atteignant éventuellement le point de dépasser une valeur INT.

Solution alternative étant donné le désir de ne pas avoir d'espace :

Imaginez une procédure pour :UpdateSortOrder avec des paramètres de @NewOrderVal, @IDToChange,@OriginalOrderVal

Processus en deux étapes selon si le nouvel/ancien ordre monte ou descend dans le tri.

If @NewOrderVal < @OriginalOrderVal --Moving down chain 

--Create space for the movement; no point in changing the original 
    Update product set order = order+1 
    where order BETWEEN @NewOrderVal and @OriginalOrderVal-1;

end if

If @NewOrderVal > @OriginalOrderVal --Moving up chain

--Create space  for the momvement; no point in changing the original  
  Update product set order = order-1 
  where order between @OriginalOrderVal+1 and @NewOrderVal
end if

--Finally update the one we moved to correct value

    update product set order = @newOrderVal where [email protected];

Concernant les meilleures pratiques ; la plupart des environnements dans lesquels j'ai été veulent généralement quelque chose regroupé par catégorie et trié par ordre alphabétique ou basé sur la "popularité en vente", éliminant ainsi la nécessité de fournir un tri défini par l'utilisateur.