2010-12-02 20 views
5

Recientemente agregué un par de campos a algunas tablas en mi base de datos (SQL Server 2005) para permitir a los usuarios personalizar el orden de las filas. He seguido este patrón para todas las tablas:Establecer el campo de orden de clasificación según el orden alfabético de otro campo

-- Alter the InvoiceStatus table 
ALTER TABLE [dbo].[InvoiceStatus] ADD [Disabled] bit NOT NULL DEFAULT 0 
GO 
ALTER TABLE [dbo].[InvoiceStatus] ADD [SortOrder] int NOT NULL DEFAULT 0 
GO 
-- Use the primary key as the default sort order 
UPDATE [dbo].[InvoiceStatus] 
    SET [SortOrder] = [InvoiceStatusId] 
GO 

Normalmente, como se puede ver, he utilizado la clave principal como el orden predeterminado. Sin embargo, ahora estoy en la situación de que me gustaría utilizar el orden alfabético de un campo de texto en la tabla como el orden de clasificación predeterminado.

Utilizando la tabla anterior como ejemplo (que tiene un campo de texto [InvoiceStatusName]), ¿hay alguna consulta corta y bonita similar que pueda escribir para usar el orden alfabético de [InvoiceStatusName] como orden de clasificación predeterminado?

Actualización:
La pregunta ya está contestada, pero algunos han señalado que esta solución podría no ser ideal por lo que sólo quieren añadir un cierto contexto para futuras referencias. Este es un sistema antiguo (no antiguo, pero ha existido durante algunos años) en uso en un puñado de lugares diferentes.

Hay varias listas/menús desplegables en la aplicación con su "status" tipo típico (como estado de la factura, estado orden, tipo cliente etc.). Antes, cuando el sistema se escribió por primera vez, estos eran valores estándar en uso en todos los lugares (no destinados a ser cambiados de ninguna manera), pero algunos usuarios han comenzado a solicitar la posibilidad de agregar nuevos estados, eliminar los que ya no están en uso y especificar una costumbre orden de clasificación (un estado puede ser usado con más frecuencia, y es bueno tenerlo en la parte superior de la lista).

La manera más fácil que encontré para hacerlo (sin tener que meterme demasiado con el código anterior) fue agregar dos nuevos campos, Disabled y , a todas las tablas relevantes. El campo Disabled se usa para "ocultar" tipos no utilizados (no puede eliminarlos debido a la integridad referencial, y el valor que guardan también debe mantenerse), y el campo SortOrder está allí para que los usuarios puedan especificar su propio tipo personalizado orden. Dado que todas las tablas relevantes también comparten estas mismas dos columnas, fue muy fácil crear una interfaz simple para manejar la clasificación (y la desactivación) de una manera genérica.

Respuesta

6
;WITH so AS 
(
SELECT 
    SortOrder, 
    ROW_NUMBER() OVER (ORDER BY InvoiceStatusName) AS rn 
FROM dbo.InvoiceStatus 
) 
UPDATE so SET SortOrder = rn 
+1

+1 thx Martin. Aprendí algo nuevo hoy. * Por cierto, puede soltar la columna InvoiceStatusID. * –

+0

Gracias tanto a Martin como a Lieven. Ambas sugerencias son buenas, pero elegí la de Martin como la aceptada porque tenía el aspecto más limpio. – Nailuj

3

Puede utilizar la función ROW_NUMBER() para asignar el nombre ordenado a un número entero.

UPDATE dbo.InvoiceStatus 
SET  SortOrder = ivsn.Number 
FROM dbo.InvoiceStatus ivs 
     INNER JOIN (
      SELECT dbo.InvoiceStatusID 
       , [number] = ROW_NUMBER() OVER (ORDER BY InvoiceStatusName) 
      FROM dbo.InvoiceStatus 
     ) ivsn ON ivsn.InvoiceStatusID = ivs.InvoiceStatusID 

Debe preguntarse si este esquema es la mejor solución para su problema. La implementación tal cual no se escala bien.

+0

No necesita unirse para esto. –

+0

@Martin: Estaba reflexionando sobre eso, pero no pude encontrar la manera de escribirlo * sin * la auto-unión. Si creas una nueva respuesta sin la auto-unión, la votaría mejor. –

+0

@Lieven - ¡Hecho! Puede actualizar la expresión de la tabla en sí. (funciona con CTE o tabla derivada) –

1

La forma en que ha elegido implementar la clasificación de tablas es inusual y aparentemente restringida a la clasificación por enteros solamente.

Realmente recomiendo que rediseñe su subsistema de clasificación de otra manera.

por ejemplo, tener una tabla de meta-datos en alguna parte que contiene el nombre de la columna que los usuarios desean para ordenar por, y luego utilice ORDER BY (columnname) en las consultas pertinentes

edición: Oh, espera, estamos hablando de tablas de búsqueda y dejar que los usuarios cambien el orden. Ahora entiendo que su implementación tiene mucho más sentido para mí.

+0

Buenas consultas de actualización, sin embargo, Martin y Lieven. Yo soy el gruñón en esta fiesta, evidentemente. – codeulike

+0

No sonaba malhumorado y por lo que vale, también creo que OP querrá cambiar su diseño para acomodar futuras solicitudes. –

+0

Mi intención no es permitir que los usuarios elijan por qué columna debe ordenar la tabla. Deben poder controlar el orden de clasificación real de las filas (utilizado para la presentación en la aplicación). – Nailuj

Cuestiones relacionadas