Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando uma coluna de ordem de classificação em uma tabela de banco de dados

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

Embora com o tempo você obtenha "espaços" cada vez maiores em seu pedido, mas ainda "classificar"

Isso adicionará 1 ao valor que está sendo alterado e todos os valores após ele em uma instrução, mas a instrução acima ainda é verdadeira. "espaços" cada vez maiores se formarão em sua ordem, possivelmente chegando ao ponto de exceder um valor INT.

Solução alternativa dada o desejo por nenhum espaço:

Imagine um procedimento para:UpdateSortOrder com parâmetros de @NewOrderVal, @IDToChange,@OriginalOrderVal

Processo de duas etapas, dependendo se a ordem nova/antiga está subindo ou descendo a classificação.
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];

Quanto às melhores práticas; a maioria dos ambientes em que estive normalmente deseja algo agrupado por categoria e classificado em ordem alfabética ou com base em "popularidade à venda", negando assim a necessidade de fornecer uma classificação definida pelo usuário.