none
Como insertar una consulta ordenada? RRS feed

  • Pregunta

  • Hago una consulta que ordena de A-C Pero al insertarla en una columna de otra tabla se inserta de manera desordenada.

    Quiero que al insertar se mantenga el orden  asi

    martes, 15 de septiembre de 2020 13:47

Todas las respuestas

  • Hola BlackCode23:

    No es posible.

    La matemática de conjuntos no entiende de orden. Para eso nos proveen de Order by.

    Puedes plantear cualquier solución, insertar en una variable, con un identity, leer con un row_number etc, etc.... y todo te irá genial, hasta el día que el motor, por muchas causas, determine, que una sentencia de inserción le venga mejor hacerlo de otra manera, porque el hardware, a la hora de escribir le resulte más optimo hacerlo de otra, y te habrá jodido ese orden. Y mucho más obvio es que aunque lo insertase de un modo ordenado, al recuperar los valores, estos no tienen porque venir ordenados.

    Texto explicito:

    order by

    <cite>Ordena los datos devueltos por una consulta en SQL Server. Use esta cláusula para lo siguiente: Ordenar el conjunto de resultados de una consulta por la lista de columnas especificada y, opcionalmente, limitar las filas devueltas a un intervalo especificado. El orden en que se devuelven las filas en un conjunto de resultados no se puede garantizar, a menos que se especifique una cláusula ORDER BY</cite>

    https://docs.microsoft.com/es-es/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15


    Encontrarás mucha documentación al respecto.

    https://es.stackoverflow.com/questions/42135/sql-insert-select-ordenado

    Hay malas soluciones, que a veces funcionan, pero no siempre, como utilizar una vista y en ella incluir order by.

    Como no se puede utilizar order by en una vista, se "trampea" haciendo un Select top(100) percent .... order by columna, y a veces funciona, pero la documentación de SQL Server indica que esto no se puede hacer.

    Porque no se debe de utilizar en una vista. O al menos, que sepas los riesgos que puedes correr.

    https://blog.sqlauthority.com/2010/08/23/sql-server-order-by-does-not-work-limitation-of-the-views-part-1/

    martes, 15 de septiembre de 2020 14:44
  • Hola BlackCode23:

    Voy a completar mi respuesta, porque hay algo que me he saltado y es importante.

    En SQL Server existen dos tipos de tabla. 

    Las que se definen como montón, que son tablas que se van llenando con lo que les va insertando sin ningún tipo de orden, y las tablas con una definición de índice clustered, que mantienen un orden.

    Para que una tabla tenga un orden de inserción solo se necesita que le des una clave primaria.

    Create table dbo.orden
    (
    	columna1 varchar(10) primary key
    );
    go

    Con añadir primary key a la definición de la tabla, ya nos ha creado un índice agrupado por la columna columna1.

    Preguntándole al procedure sp_helpindex de la tabla

    exec sp_helpindex orden

    Ahora los datos se ordenan al insertar por la columna1 que es clustered index.

    Pero el orden de la columna no implica que los resultados se te devuelvan ordenados.

    Para eso, solo puedes aplicar order by.

    miércoles, 16 de septiembre de 2020 4:04