2010-11-04 16 views
5

En la tabla quiero 'mover' filas, tengo una columna llamada sortid, que automáticamente al insertar es un valor más alto que el más alto valor (que se encuentra fácilmente seleccionando el valor superior al ordenar mi descódigo sortid).Mover filas 'arriba y abajo' en una base de datos (ayuda de consulta SQL)

Pero estoy un poco confundido sobre qué consulta usaría para las acciones 'arriba/abajo' para cada fila en mi página ASP.NET. ¿Qué consulta usaría para seleccionar las filas inmediatamente 'debajo' o 'arriba' de la fila que se moverá?

Gracias

Respuesta

7

Mover un registro hacia arriba o hacia abajo se hace intercambiándolo con el registro anterior o posterior, respectivamente.

Si los valores SortId son siempre continuos (es decir, no elimina los registros que causarían un espacio), entonces puede simplemente agregar o restar uno para obtener el registro siguiente o anterior. Si no se garantiza que los registros sean continuos, entonces debe encontrar el registro junto al que desea mover.

Para encontrar el SortId del expediente que:

select max(SortId) from TheTable where SortId < @SortId 

Para encontrar el SortId del registro después de:

select min(SortId) from TheTable where SortId > @SortId 

para intercambiar los dos registros, puede utilizar este truco que calcula una valor del otro:

update TheTable 
set SortId = @SortId1 + @SortId2 - SortId 
where SortId in (@SortId1, @SortId2) 
+0

Me gusta su solución – kta

3

Una opción es incrementar todos los campos sortid de las filas "por debajo" justo antes de INSERT ing la nueva fila. Puede hacer esto con un comando UPDATE seguido inmediatamente por un comando INSERT. Digamos que vas a insertar una fila en la posición 10. A continuación, puede hacer algo como esto:

UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10; 
INSERT INTO your_table (..., sortid) VALUES (..., 10); 

Probablemente debería concluir que en un transaction para garantizar que la operación se lleva a cabo atomically.

En cuanto a las acciones de subir/bajar, no querrá hacer un INSERT. Lo anterior solo es apropiado para agregar nuevas filas en una "ubicación" particular. Para la acción de subir/bajar, simplemente puede "cambiar" el valor sortid de las dos filas, como @Guffa suggested in the other answer.

1

Para obtener las filas por encima de la fila de destino.

select * from [TableName] 
where sortid > (select sortid from [TableName] 
       where id = @id) 

Para las siguientes, simplemente use < en su lugar.

Cuestiones relacionadas