2012-10-10 14 views
5

Tengo una situación y soy débil en SQL. Aquí está.SQL actualiza una columna que perdió el orden?

He archivado elementos, que se almacenan con un número. Es así en la tabla de la base de datos.

RowId Number CaseId 
234  1  787 
235  2  787 
236  3  787 
237  4  787 
238  5  787 

Así es como se ve cuando se inserta por primera vez. Pero después de eliminar, tomar el número 3 se elimina, ahora es así en DB.

RowId Number CaseId 
234  1  787 
235  2  787 
237  4  787 
238  5  787 

3 se ha ido, pero lo que necesito es esto.

RowId Number CaseId 
234  1  787 
235  2  787 
237  3  787 
238  4  787 

Los números también se deben actualizar. Pero no puedo encontrar una manera de hacer esto. Por cierto, hay muchos CaseId. No actualizaré toda la tabla, la seleccionaré con CaseId. ¿Me puede decir cómo hacer esto? Estoy usando C# .NET

¿Debo incluirlos en una lista (la forma en que se ordenan a partir de la consulta Seleccionar) y verificar uno por uno y luego actualizarlos? Puedo escribir el cheque uno por uno en C#, pero creo que no será eficiente. ¿Cuál es una manera eficiente de hacer esto?

+2

¿necesita almacenar el "Número" no puede simplemente calcularlo cuando selecciona fuera de la tabla? –

+2

Entonces no necesita ningún "Número" de columna "verdadero". Simplemente OrderBy RowId y use row_number() –

+1

En el caso, sugeriré que no almacene Number en su base de datos. Siempre que necesite el resultado anterior simplemente escriba una consulta SELECT con Row_number(). para más detalles, verla: http://msdn.microsoft.com/en-us/library/ms186734.aspx –

Respuesta

4

¿Hay que actualizar el número en la base de datos? Si no, ¿incluso necesitas guardar esto? ¿También estás escribiendo consultas SQL? ¿O simplemente usando Entity Framework? Si está escribiendo consultas reales, y si lo que desea es el número de fila cuando se selecciona los datos de nuevo se puede intentar algo como:

SELECT RowId, ROW_NUMBER() OVER (ORDER BY RowId ASC) AS [Number], CaseId 
FROM [MyTable] 
WHERE CaseID = 787 

EDIT: Como ha señalado @ Mike en los comentarios, que probablemente haría sentido para hacer una vista de esto. Puede eliminar [número] de la tabla principal y hacer una vista como:

CREATE VIEW dbo.MyView 
AS 
    SELECT RowId, 
    ROW_NUMBER() OVER (PARTITION BY CaseId ORDER BY RowId ASC) AS Number, 
    CaseId FROM MyTable 

El PARTITION se asegurará de que Número restablece por cada RowId distinta

+1

+1 - Esta es una solución mucho mejor si es posible y se podría crear una vista o procedimiento almacenado que todavía podría ser aprovechado por Entity Framework. –

+0

Tengo que almacenar el número en la base de datos. Se usa para búsqueda. ¿Puedo hacer esto en la base de datos sin recuperarlo primero y luego actualizarlo? – Ada

+0

@Ada, ciertamente puede consultar en contra de una vista y, a menos que encuentre que causa problemas de rendimiento ** severos, lo haría de esa manera. Almacenar un valor entero como el de esta pregunta en una tabla es muy parecido a almacenar el precio total de un pedido de cliente; es una mala idea porque es muy difícil de mantener. –

1

Esto se puede lograr con ROW_NUMBER(), una variable de tabla y una actualización en dos tablas!

-- Declare a variable to hold case id 

-- This can easily be moved into the signature 
-- of a sproc. 
DECLARE @caseId INT; 
SELECT @caseId = 787; 


-- Table variable to hold results 
DECLARE @newOrder TABLE 
(
    CaseId int, 
    RowId int, 
    SortOrder int 
) 

-- Use row number to work out the new sort order 
-- positions 
INSERT INTO 
    @newOrder 
SELECT 
    CaseId, 
    RowId, 
    ROW_NUMBER OVER (ORDER BY [Number]) AS SortOrder 
FROM 
    [Cases] 
WHERE 
    CaseId = @caseId 


-- Finally, perform a multi-table update using 
-- the new sort orders from the table variable 
UPDATE 
    c 
SET 
    [Number] = o.SortOrder 
FROM 
    Cases c, 
    @newOrder o 
WHERE 
    c.RowId = o.RowId 
AND c.CaseId = @caseId 
Cuestiones relacionadas