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)

?
¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top