transact into index from ejemplos sql-server tsql sql-order-by select-into

sql server - index - Preservar ORDER BY en SELECT INTO



transact sql ejemplos (4)

Tengo una consulta tSQL que toma los datos de una tabla y los copia en una nueva tabla, pero solo las filas cumplen una determinada condición:

SELECT VibeFGEvents.* INTO VibeFGEventsAfterStudyStart FROM VibeFGEvents LEFT OUTER JOIN VibeFGEventsStudyStart ON CHARINDEX(REPLACE(REPLACE(REPLACE(logName, ''MyVibe '', ''''), '' new laptop'', ''''), '' old laptop'', ''''), excelFilename) > 0 AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL ORDER BY VibeFGEvents.id

El código que utiliza la tabla depende de su orden, y la copia anterior no conserva el orden que esperaba. Es decir, las filas de la nueva tabla VibeFGEventsAfterStudyStart no aumentan monótonamente en la columna VibeFGEventsAfterStudyStart.id copiada de VibeFGEvents.id .

En tSQL, ¿cómo puedo conservar el orden de las filas de VibeFGEvents en VibeFGEventsStudyStart ?


¿Para qué?

El punto es - los datos en una tabla no están ordenados. En SQL Server, el orden de almacenamiento intrínseco de una tabla es el del índice agrupado (si está definido).

El orden en que se insertan los datos es básicamente "irrelevante". Se olvida en el momento en que los datos se escriben en la tabla.

Como tal, nada se gana, incluso si obtienes esto. Si necesita un pedido cuando trata con datos, TIENE que poner una cláusula order by en el select que lo obtiene. Cualquier otra cosa es aleatoria, es decir, el orden en el que los datos no se determinan y pueden cambiar.

Por lo tanto, no tiene sentido tener un orden específico en el inserto mientras intenta lograrlo.

SQL 101: los conjuntos no tienen orden.


Intente utilizar INSERT INTO lugar de SELECT INTO

INSERT INTO VibeFGEventsAfterStudyStart SELECT VibeFGEvents.* FROM VibeFGEvents LEFT OUTER JOIN VibeFGEventsStudyStart ON CHARINDEX(REPLACE(REPLACE(REPLACE(logName, ''MyVibe '', ''''), '' new laptop'', ''''), '' old laptop'', ''''), excelFilename) > 0 AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL ORDER BY VibeFGEvents.id`


Sospecho que el motor de consultas está optimizando el orden para cuando está haciendo las inserciones. No sé si esto funcionará, pero será un experimento rápido

Tratar

SELECT rowstoinsert.* INTO VibeFGEventsAfterStudyStart FROM (SELECT VibeFGEvents.* FROM VibeFGEvents LEFT OUTER JOIN VibeFGEventsStudyStart ON CHARINDEX(REPLACE(REPLACE(REPLACE(logName, ''MyVibe '', ''''), '' new laptop'', ''''), '' old laptop'', ''''), excelFilename) > 0 AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL ORDER BY VibeFGEvents.id) rowstoinsert

Basado en más información

SELECT rowstoinsert.* INTO VibeFGEventsAfterStudyStart FROM (SELECT VibeFGEvents.* FROM VibeFGEvents LEFT OUTER JOIN VibeFGEventsStudyStart ON CHARINDEX(REPLACE(REPLACE(REPLACE(logName, ''MyVibe '', ''''), '' new laptop'', ''''), '' old laptop'', ''''), excelFilename) > 0 AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL) rowstoinsert ORDER BY rowstoinsert.id

Sin embargo, tengo que ser mi última suposición y no tengo un servidor sql disponible en este momento.


Sé que esto es un poco viejo, pero necesitaba hacer algo similar. Quería insertar el contenido de una tabla en otra, pero en orden aleatorio. Descubrí que podía hacer esto usando select top n y order by newid() . Sin la ''top n'', el orden no se conservó y la segunda tabla tenía filas en el mismo orden que la primera. Sin embargo, con ''top n'', el orden (al azar en mi caso) fue preservado. Usé un valor de ''n'' que era mayor que el número de filas. Entonces mi consulta fue en la línea de:

insert Table2 (T2Col1, T2Col2) select top 10000 T1Col1, T1Col2 from Table1 order by newid()