Los datos relacionales a archivos planos
-
18-09-2019 - |
Pregunta
Espero que pueda ayudar a encontrar una respuesta a un problema que se convertirá en un tema recurrente en el trabajo. Esto implica desnormalizar datos de las tablas RDBMS a formatos de archivos planos con grupos de repetición (intercambio de dominios y significado) a través de las columnas. Por desgracia, esto es inevitable.
Aquí hay un ejemplo muy simplificado de la transformación me requiero:
TABLE A TABLE B ------------------- 1 -> MANY ---------------------------- A_KEY FIELD_A B_KEY A_KEY FIELD_B A_KEY_01 A_VALUE_01 B_KEY_01 A_KEY_01 B_VALUE_01 A_KEY_02 A_VALUE_02 B_KEY_02 A_KEY_01 B_VALUE_02 B_KEY_03 A_KEY_02 B_VALUE_03
Esto se convertirá en:
A_KEY FIELD_A B_KEY1 FIELD_B1 B_KEY2 FIELD_B2 A_KEY_01 A_VALUE_01 B_KEY_01 B_VALUE_01 B_KEY_02 B_VALUE_02 A_KEY_02 A_VALUE_02 B_KEY_03 B_VALUE_03
Cada entrada de TABLE A
tendrá una fila en el archivo plano de salida con una columna por campo relacionado de TABLE B
. Las columnas en el archivo de salida pueden tener valores vacíos para campos obtenidos de TABLE B
.
Me doy cuenta de que esto creará un archivo muy amplia , pero esto es un requisito. He echado un vistazo a MapForce y Apatar, pero creo que este problema es demasiado extraño o no puedo usarlos correctamente.
Mi pregunta: ¿existe ya una herramienta que va a lograr esto o debería desarrollar uno desde cero (no quiero reinventar la rueda)
?Solución 3
Gracias por toda su ayuda. Pues resulta que la relación es UNO -> MAX de 3 y esta restricción no va a cambiar ya que los datos ahora es estático por lo que el siguiente código SQL run-of-the-mill funciona:
select A.A_KEY, A.FIELD_A, B.B_KEY, B.FIELD_B, B2.B_KEY, B2.FIELD_B, B3.B_KEY, B3.FIELD_B from A left join B on (A.A_KEY = B.A_KEY) left join B B2 on (A.A_KEY = B2.A_KEY and B2.B_KEY != B.B_KEY) left join B B3 on (A.A_KEY = B3.A_KEY and B3.B_KEY != B.B_KEY and B3.B_KEY != B2.B_KEY) group by A.A_KEY order by A.A_KEY
Otros consejos
Estoy bastante seguro de que no puede resolver esto en SQL normal, pero dependiendo de su RDBMS, puede ser posible crear un procedimiento almacenado o algo por el estilo. Por lo demás es una cosa bastante fácil de hacer en un lenguaje de script. ¿Qué tecnología se utiliza?
¿Esto ayuda?