2009-02-04 5 views
8

Recientemente importé unos 60k registros en una tabla que relaciona datos en una tabla con datos en otra tabla. Sin embargo, mi cliente ha solicitado desde entonces que se agregue un orden de clasificación a todos los 60k registros. Mi esperanza es que haya una buena forma de autogenerar estos órdenes de clasificación en una actualización de SQL. Los datos terminados deberían verse más o menos así:Auto generar órdenes de clasificación con SQL ACTUALIZAR

item1ID item2ID sortOrder 
1   123  1 
1   12  2 
1   45  3 
1   22  4 
1   456  5 
2   5   1 
2   234  2 
2   56  3 

¿Se puede hacer esto? Cualquier sugerencia sería muy apreciada.

--Anne

Respuesta

10

puede usar [ROW_NUMBER] [1] y la partición por Item1ID

UPDATE t1 
SET t1.SortOrder = t2.SortOrder 
FROM @t t1 
INNER JOIN 
(SELECT Item1ID, Item2ID, ROW_NUMBER() OVER 
    (PARTITION BY Item1ID ORDER BY Item1ID, Item2ID) AS SortOrder 
from @t) t2 
ON t1.Item1ID = t2.Item1ID 
AND t1.Item2ID = t2.Item2ID 
+0

Esa es una gran manera de cambiar SortOrder para ordenar por la segunda columna sobre la primera columna. No estaba claro que eso era lo que el cartel estaba pidiendo, porque los datos de los ejemplos no estaban ordenados por las dos primeras columnas. Aún así, esa es una gran respuesta. – eksortso

+0

Consulte la siguiente pregunta: http://stackoverflow.com/questions/1934738/custom-sort-order-with-sql-server-and-net-entity-framework – Shimmy

0

En teoría, se podría decir:

update mytable 
    set sortOrder = row_number() 
    over (partition by item1id order by item1id, item2id) from mytable 

Sin embargo, que voy a dar aparece un mensaje de error:

Msg 4108, Level 15, State 1, Line 1 
Windowed functions can only appear in the SELECT or ORDER BY clauses. 

Entonces, realmente tiene que hacerlo en dos pasos: primero, seleccione los valores en una tabla temporal y luego actualice su original desde la tabla temporal.

Por ejemplo:

select 
    item1ID, 
    item2ID, 
    row_number() 
     over (partition by item1id order by item1id, item2id) as sortOrder 
    into #tmp 
    from mytable 

update mytable 
    set sortOrder = T.sortOrder 
    FROM 
    mytable M 
    inner join #tmp T 
     on M.item1ID = T.item1ID 
     AND M.item2ID = T.item2ID 

drop table #tmp 
1

Estás tocando en algo fundamental sobre el modelo relacional aquí. En las bases de datos en general, no existe un orden intrínseco. Si desea obtener un pedido de datos cada vez que mira una tabla, debe especificar ese orden explícitamente.

Así que en un sentido general sentido, estás pidiendo lo imposible. No puede simplemente UPDATE una tabla y obtener un pedido automático de cualquier consulta que realice en él. Pero en un sentido consulta por consulta, siempre puede poner "ORDER BY item1ID, sortOrder" en cualquier declaración SELECT que aplique a la tabla.

En SQL Server 2005, se podría escribir una vista y presentarla a su cliente, el uso de este viejo truco:

SELECT TOP 100 PERCENT 
    item1ID, item2ID, sortOrder -- and all the other columns 
FROM YourTable 
ORDER BY item1ID, sortOrder; 

Hay maneras de hacer tal punto de vista actualizable, pero necesitará a la investigación eso por tu cuenta No es muy difícil de hacer.

Si nunca va a insertar o cambiar los datos en esta tabla, y si está dispuesto a volver a importar los datos en una tabla, podría definir su tabla con una identidad, luego inserte sus datos en la tabla en el orden apropiado Entonces siempre ordenarías por una columna de identidad. Eso funcionaría si su cliente siempre visualiza los datos en un programa que permite ordenarlos por una sola columna. (Por cierto, nunca utilice la función de IDENTITYpara este propósito. No funcionará.)

CREATE TABLE YourTable (
    SingleSortColumn INT IDENTITY(1,1) NOT NULL, 
    ... 
); 
INSERT INTO YourTable (
    item1ID, item2ID, sortOrder -- everything except the SingleSortColumn 
) 
SELECT -- all your columns 
INTO YourTable 
FROM yadda yadda yadda 
ORDER BY item1ID, sortOrder; 

la esperanza de que es muy útil. Lo siento si estoy siendo pedante.

+0

Tenga cuidado con el TOP 100 PERCENT y un ORDER BY en una vista. Esa sintaxis ya no es válida en SQL Server 2008. – mrdenny

Cuestiones relacionadas