Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Reemplazar los registros de una tabla por los de otra tabla

Estas en el tema de Reemplazar los registros de una tabla por los de otra tabla en el foro de Mysql en Foros del Web. Buenos días, Tengo un problemilla que no sé muy bien como resolver, y en mi libro de SQL no he encontrado la solución por lo ...
  #1 (permalink)  
Antiguo 01/02/2013, 07:40
 
Fecha de Ingreso: enero-2006
Ubicación: Barcelona, España
Mensajes: 126
Antigüedad: 18 años, 3 meses
Puntos: 1
Reemplazar los registros de una tabla por los de otra tabla

Buenos días,

Tengo un problemilla que no sé muy bien como resolver, y en mi libro de SQL no he encontrado la solución por lo que agradecería enormemente si alguien puede ayudarme.

La situación es que tengo una tabla que se llama: "ch_cars" formada por diferentes campos entre los que hay uno que se llama: "field_province". El problema es que los registros de este campo están codificados y en vez de poner el nombre de la província sale un código de dos digitos.

Después tengo otra tabla que se llama: "ch_provinces" y que está formada por dos campos, uno que se llama "field_codeprovince" y otro que se llama "field_nameprovince".

De esta forma, me gustaría que se reemplazar los códigos que aparecían en el campo "field_province" de la tabla ch_cars por el nombre real de la província que podemos encontrar en el campo "field_nameprovince" de la tabla "ch_provinces".

La tabla está formada por más de 1.000 registros por lo que estoy buscando si hay alguna manera de poder remplazar de forma automática todos los códigos por su nombre.

Estaré muy agradecido, si alguien puede hecharme una mano de como podría hacerlo, no necesito que me lo hagan, pero si me dicen el nombre de esta función, un tutorial o ejemplo, que pueda aplicar os estaré muy agradecido.

Muchas gracias de antemano,
  #2 (permalink)  
Antiguo 01/02/2013, 10:18
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Hola turminator:

La pregunta que te haría aquí sería en primer lugar, ¿por qué tienes que sustituir el valor del código por el del nombre de la provincia?

El modelo que tienes es correcto, es decir, tener una tabla "catálogo" donde tengas todas las provincias existentes, y una tabla de "datos" donde hagas referencia a tu tabla catálogo... esa es la esencia del modelo Entidad-Relación, el manejo de llaves foráneas, integridad de la información, etc... no entiendo por qué quieres arruinar tus datos de esta manera...

Si la razón que me vas a decir es que quiere mostrar el nombre de la provincia, no su código... bueno, pues no sería una razón válida, pues con hacer un simple JOIN quedaría solucionado. Entonces??? pero bueno, para hacer lo que quieres en realidad tienes muchas formas de hacerlo, una sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaX;
  2. +------+-------------+
  3. | idX  | descripcion |
  4. +------+-------------+
  5. | 1    | uno         |
  6. | 2    | dos         |
  7. | 3    | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tablaY;
  12. +------+--------------+--------------+
  13. | idY  | descripcionY | descripcionX |
  14. +------+--------------+--------------+
  15. |    1 | one          | 1            |
  16. |    2 | two          | 2            |
  17. |    3 | tres         | 3            |
  18. +------+--------------+--------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> UPDATE tablaY, tablaX SET tablaY.descripcionX = tablaX.descripcion
  22.     -> WHERE tablaY.descripcionX = tablaX.idX;
  23. Query OK, 3 rows affected (0.03 sec)
  24. Rows matched: 3  Changed: 3  Warnings: 0
  25.  
  26. mysql> SELECT * FROM tablaY;
  27. +------+--------------+--------------+
  28. | idY  | descripcionY | descripcionX |
  29. +------+--------------+--------------+
  30. |    1 | one          | uno          |
  31. |    2 | two          | dos          |
  32. |    3 | tres         | tres         |
  33. +------+--------------+--------------+
  34. 3 rows in set (0.00 sec)

Aquí debes tener cuidado en que los tipos de datos y las longitudes de tus columnas sean iguales, pues de lo contrario es posible que tengas pérdida de información o que ni siguiera te permita hacer la actualización.

Saludos
Leo.
  #3 (permalink)  
Antiguo 01/02/2013, 10:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Coincido con Leonardo en lo que te dice, hacer lo que dices arruinará el diseñó de datos que tienes ahora.
Lo que yo te sugeriría es que si quieres no tener que escribir la sentencia con los JOIN en todas las ocasiones, simplemente construyas una vista (VIEW) donde obtengas ya la información consolidada. No necesitas más que eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 01/02/2013, 11:01
 
Fecha de Ingreso: enero-2006
Ubicación: Barcelona, España
Mensajes: 126
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Buenos días,

Lo que comentáis tiene mucho sentido. Lo que ocurre que tengo que crear un documento posterior con .csv con todos los datos escrito en cada fila y me interesa que estén en este formato.

He probado la función que me habéis comentado, sustituyéndola por mis valores y aunque me ha modificado los valores en la primera tabla, ahora todos los registros han adoptado el valor de CADIZ.

Analizando un poco la función me doy cuenta que no se especifica ninguna interrelación entre el número que tenían mis registros: 01 (para CADIZ), 02 (para CACERES)... por lo que a la hora de hacer la sustitución. Cuando veía el numero 01 lo ha sustituido por CADIZ y cuando ha visto el numero 02 también.

¿Como podríamos solucionarlo?

Muchas gracias por vuestra ayuda.
  #5 (permalink)  
Antiguo 01/02/2013, 11:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Empieza por mostrarnos la consulta que usaste para tal "sustitución", a fin de ver por qué se produce el error.
Tengo una idea de la causa, pero sin ver cómo es la sintaxis de lo usado, no puedo estar seguro de que estemos hablando de lo mismo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 01/02/2013, 11:09
 
Fecha de Ingreso: enero-2006
Ubicación: Barcelona, España
Mensajes: 126
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Hola de neuvo,

LA función que usé en SQL fue:

Código MySQL:
Ver original
  1. UPDATE ch_catalogo, ch_provincias SET ch_catalogo.field_province = ch_provincias.NOMBRE

Dónde ch_catalogo es la tabla que quería modificar con los nombres de la tabla ch_provincias que aparecían en el campo: "Nombre".

Muchas gracias.
  #7 (permalink)  
Antiguo 01/02/2013, 11:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

El problema que veo, desde el inicio, es que no existe en este update una condición de JOIN:
Código MySQL:
Ver original
  1.     ch_catalogo, ch_provincias
  2.     SET ch_catalogo.field_province = ch_provincias.NOMBRE;
Esto es, no estás diciendole a MyQSL cómo relacionar los registros de una tabla con los de la otra, así que MySQL asume que deben existir ciertas cosas: que en ambas tablas hay un campos con idéntico nombre y donde el valor de uno de ellos en una tabla referencia a la PK de la otra tabla.
Sin eso se genera un producto cartesiano, con resultados inesperados, y muy probablemente incorrecto.
Espero que no hayas intentado esto en una base de datos en producción. Las consecuencias pueden ser catastróficas...

Dinos cuál es el campo que relaciona a ch_catalogo con ch_provincias y cómo se llama en cada caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 01/02/2013, 11:24
 
Fecha de Ingreso: enero-2006
Ubicación: Barcelona, España
Mensajes: 126
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Hola gnzsoloyo,

Eso mismo estaba pensando ahora y traté de editar el post anterior:

Cita:
Lo que no entiendo de esta consulta es que como va a saber qué valor en números equivale al nombre corecto de la província. Ya que en principio solo ha relacionado el campo "field_province" que son números, con el campo "NOMBRE" que son letras. ¿No debería de usarse el campo: "CODPROV" que enlaza los números con las letras?
El campo que hace de intermediario es "CODPROV" que se encuentra en la segunda tabla: "ch_provincias" y que está relacionado con el campo "field_province" de la tabla "ch_catalogo"

Muchas gracias por hacerme un poco menos ignorante.

Última edición por turminator; 01/02/2013 a las 11:43
  #9 (permalink)  
Antiguo 01/02/2013, 12:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Hola de nuevo turminator:

Mucho ojo, tal como hace notar gnzsoloyo te falta poner la condición de unión... Si pones un poquito te atención, en mi ejemplo hay esto:

Código:
...
WHERE tablaY.descripcionX = tablaX.idX
...
es decir, aquí especifico por qué campos están relacionados ambas tablas.

Volviendo al tema de por qué tienes que hacer esta actualización... insisto en que se me hace completamente innecesaria y absurda... si tu intención es crear un .cvs con el formato que quieras ¿Qué te hace pensar que tu tabla tiene que tener los datos tal como los quieres?... Ya gnzsoloyo te dijo también que puedes utilizar una vista, de tal manera que sea la vista la que exportes al formato que quieras, pero sin poner en riesgo la integridad de tu información.

saludos
Leo.
  #10 (permalink)  
Antiguo 01/02/2013, 13:16
 
Fecha de Ingreso: enero-2006
Ubicación: Barcelona, España
Mensajes: 126
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: Reemplazar los registros de una tabla por los de otra tabla

Hola de nuevo,

Acabo de hacer las correcciones que comentas y funciona correctamente. Yo no soy programador profesional, solo aficionado a este mundo que me parece immenso y lo que comentais teneis razón. El problema es que necesito tener la información estructurada de esta forma, para importarla después en un componente de Joomla que se llama SobiPRO, y que entonces por cada valor de cada registro distinto, el sistema crea una entrada nueva en una tabla.

La verdad no lo acabo de entender muy bien, ya que como decís de esta forma la base de datos es mucho más grande que de la otra forma.

De verdad, muchas gracias a los dos ya que con vuestra ayuda, me habéis ahorrado muchos dolores de cabeza.

Etiquetas: campos, reemplazar, registros, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.