sql - transponer - Reordene las columnas de la tabla en Oracle
pivot oracle columns to rows (4)
Tengo una tabla con más de 50 columnas y necesito cambiar el orden de las dos primeras columnas. ¿Cuál es la mejor manera de lograr esto usando Oracle? Supongamos que el nombre de la tabla es ORDERDETAILS y, como está, las primeras dos columnas son ITEM_ID y ORDER_ID. Una vez que se haya completado el cambio de nombre, el nombre de la tabla seguirá siendo ORDERDETAILS, pero las dos primeras columnas serán ORDER_ID e ITEM_ID. FWIW, tipos de columna y el resto de las columnas y su orden es irelevent.
Corrígeme si me equivoco, pero creo que los pasos generales son:
- Cambia el nombre de la tabla existente.
- Elimine la restricción de clave primaria.
- Vuelva a crear la tabla con el orden correcto de columnas.
- Artículo de lista
- Ejecute INSERT INTO .. SELECT para mover los datos de la temperatura a la tabla en el paso # 3.
- Suelta la tabla de temp.
Tengo poca experiencia con Oracle, así que tal vez me faltan un paso o dos.
¿Una clave principal implica un índice en Oracle? ¿Dejar caer la clave principal también cae el índice?
Los ejemplos de SQL son muy apreciados.
EDITAR: Un sincero agradecimiento a quienes cuestionan por qué es necesario hacerlo en lugar de brindar ayuda. Para responder a su pregunta de por qué es necesario: estoy siguiendo las órdenes de otra persona que dice que debo hacerlo de esta manera y el orden de las columnas SÍ importa. Mis pensamientos / opiniones sobre esto son irrelevantes.
Desde el lanzamiento de Oracle 12c, ahora es más fácil reorganizar las columnas lógicamente.
Oracle 12c agregó soporte para hacer columnas invisibles y esa característica se puede usar para reorganizar columnas lógicamente.
Cita de la documentación sobre columnas invisibles :
Cuando hace visible una columna invisible, la columna se incluye en el orden de columnas de la tabla como la última columna.
Ejemplo
Crea una tabla:
CREATE TABLE t (
a INT,
b INT,
d INT,
e INT
);
Agrega una columna:
ALTER TABLE t ADD (c INT);
Mueva la columna al centro:
ALTER TABLE t MODIFY (d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (d VISIBLE, e VISIBLE);
DESCRIBE t;
Name
----
A
B
C
D
E
Créditos
Aprendí sobre esto de un artículo de Tom Kyte sobre las nuevas características en Oracle 12c .
Es triste que Oracle no permita esto, los desarrolladores me piden que haga esto todo el tiempo ...
Aquí hay un método ligeramente peligroso, algo rápido y sucio:
- Asegúrese de tener suficiente espacio para copiar la Tabla
- Tenga en cuenta las restricciones, subvenciones, índices, sinónimos, desencadenantes, um .. tal vez algunas otras cosas, que pertenece a una tabla, que no he pensado?
-
CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
-
DROP TABLE table_wrong_columns;
- ''ALTER TABLE table_right_columns RENAME TO table_wrong_columns; `
- Ahora la parte asquerosa: vuelva a crear todos los elementos que anotó en el paso 2 anterior
- Compruebe qué código ahora no es válido y vuelva a compilar para comprobar si hay errores
¡Y la próxima vez que cree una tabla, tenga en cuenta los requisitos futuros! ;)
Mire el paquete DBMS_Redefinition. Reconstruirá la tabla con el nuevo orden. Se puede hacer con la tabla en línea.
Como señaló Phil Brown, piense detenidamente antes de hacer esto. Sin embargo, hay una sobrecarga al escanear la fila de columnas y mover datos en la actualización. Reglas de pedido de columna que uso (sin ningún orden en particular):
- Agrupe columnas relacionadas juntas.
- No columnas NULL antes de columnas nulables.
- Primero buscó columnas no indexadas con frecuencia.
- Raramente llenaron columnas nulables por última vez.
- Columnas estáticas primero.
- Columnas Varchar actualizables más tarde.
- Columnas indexadas después de otras columnas de búsqueda.
Estas reglas entran en conflicto y no se han probado todas las prestaciones en la última versión. La mayoría han sido probados en la práctica, pero no documenté los resultados. Las opciones de ubicación tienen como objetivo uno de los tres objetivos conflictivos: colocación de columna fácil de entender; recuperación rápida de datos; y movimiento de datos mínimo en las actualizaciones.
Use la vista para sus esfuerzos por alterar la posición de la columna: CREAR VER CORREGIR_POSICIÓN COMO SELECCIONADA co1_1, col_3, col_2 FROM UNORDERDED_POSITION debería ayudar.
Estas solicitudes se realizan para que se generen algunos informes donde se utiliza SELECT * FROM [table_name]. O bien, algunas empresas tienen un enfoque jerárquico de colocar la información en orden para una mejor legibilidad desde el back-end.
Gracias Dilip