Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: gAb1 en 27 Junio 2015, 23:06



Título: insertar datos de diferentes tablas con left join
Publicado por: gAb1 en 27 Junio 2015, 23:06
Hola buenas! Estoy intentando unir varias tablas en una sola, pero no estoy muy seguro de como hacerlo. La estructura de las tablas es la siguiente:

Código
  1. -- tablas: en, fr, de, zh_cn, es, ru, pt_br
  2. `geoname_id` INT (11),
  3. `continent_code` VARCHAR (200),
  4. `continent_name` VARCHAR (200),
  5. `country_iso_code` VARCHAR (200),
  6. `country_name` VARCHAR (200),
  7. `subdivision_1_name` VARCHAR (200),
  8. `subdivision_2_name` VARCHAR (200),
  9. `city_name` VARCHAR (200),
  10. `time_zone` VARCHAR (200)

Son 7 tablas (cada una un idioma diferente) y me gustaría juntarlas todas en una sola, añadiendo como prefijo el código del pais delante de los nombres de las columnas.

Esta es la estructura de la nueva tabla, donde el contenido de las demás sera añadido:

Código
  1. CREATE TABLE `geo_lists` (
  2. `city_id` INT (11), -- en.geoname_id (same for all 7 tables)
  3. `continent_code` VARCHAR (2), -- en.continent_code (same for all 7 tables)
  4. `continent_name` VARCHAR (200), -- en.continent_name (just in english)
  5. `country_code` VARCHAR (2), -- en.country_iso_code (same for all 7 tables)
  6. `en_country_name` VARCHAR (200), -- en.country_name
  7. `fr_country_name` VARCHAR (200), -- fr.country_name
  8. `de_country_name` VARCHAR (200), -- de.country_name
  9. `zh_country_name` VARCHAR (200), -- zh_cn.country_name
  10. `es_country_name` VARCHAR (200), -- es.country_name
  11. `ru_country_name` VARCHAR (200), -- ru.country_name
  12. `pt_country_name` VARCHAR (200), -- pt_br.country_name
  13. `en_state_name` VARCHAR (200), -- en.subdivision_1_name
  14. `fr_state_name` VARCHAR (200), -- fr.subdivision_1_name
  15. `de_state_name` VARCHAR (200), -- de.subdivision_1_name
  16. `zh_state_name` VARCHAR (200), -- zh_cn.subdivision_1_name
  17. `es_state_name` VARCHAR (200), -- es.subdivision_1_name
  18. `ru_state_name` VARCHAR (200), -- ru.subdivision_1_name
  19. `pt_state_name` VARCHAR (200), -- pt_br.subdivision_1_name
  20. `en_province_name` VARCHAR (200), -- en.subdivision_2_name
  21. `fr_province_name` VARCHAR (200), -- fr.subdivision_2_name
  22. `de_province_name` VARCHAR (200), -- de.subdivision_2_name
  23. `zh_province_name` VARCHAR (200), -- zh_cn.subdivision_2_name
  24. `es_province_name` VARCHAR (200), -- es.subdivision_2_name
  25. `ru_province_name` VARCHAR (200), -- ru.subdivision_2_name
  26. `pt_province_name` VARCHAR (200), -- pt_br.subdivision_2_name
  27. `en_city_name` VARCHAR (200), -- en.city_name
  28. `fr_city_name` VARCHAR (200), -- fr.city_name
  29. `de_city_name` VARCHAR (200), -- de.city_name
  30. `zh_city_name` VARCHAR (200), -- zh_cn.city_name
  31. `es_city_name` VARCHAR (200), -- es.city_name
  32. `ru_city_name` VARCHAR (200), -- ru.city_name
  33. `pt_city_name` VARCHAR (200), -- pt_br.city_name
  34. `time_zone` VARCHAR (30) -- en.time_zone (same for all 7 tables)
  35. );

Así lo que estoy intentando hacer, pero algo va mal:

Código
  1. INSERT INTO geo_lists
  2. -- columns
  3. (city_id, continent_code, continent_name, country_code,
  4. en_country_name,
  5. fr_country_name,
  6. de_country_name,
  7. zh_country_name,
  8. es_country_name,
  9. ru_country_name,
  10. pt_country_name,
  11.  
  12. en_state_name,
  13. fr_state_name,
  14. de_state_name,
  15. zh_state_name,
  16. es_state_name,
  17. ru_state_name,
  18. pt_state_name,
  19.  
  20. en_province_name,
  21. fr_province_name,
  22. de_province_name,
  23. zh_province_name,
  24. es_province_name,
  25. ru_province_name,
  26. pt_province_name,
  27.  
  28. en_city_name,
  29. fr_city_name,
  30. de_city_name,
  31. zh_city_name,
  32. es_city_name,
  33. ru_city_name,
  34. pt_city_name,
  35.  
  36. time_zone)
  37.  
  38. -- end columns
  39.  
  40. SELECT
  41. en.geoname_id, en.continent_code, en.continent_name, en.country_iso_code,
  42. en.country_name AS en_country_name,
  43. fr.country_name AS fr_country_name,
  44. de.country_name AS de_country_name,
  45. zh_cn.country_name AS zh_country_name,
  46. es.country_name AS es_country_name,
  47. ru.country_name AS ru_country_name,
  48. pt_br.country_name AS pt_country_name,
  49.  
  50. en.subdivision_1_name AS en_state_name,
  51. fr.subdivision_1_name AS fr_state_name,
  52. de.subdivision_1_name AS de_state_name,
  53. zh_cn.subdivision_1_name AS zh_state_name,
  54. es.subdivision_1_name AS es_state_name,
  55. ru.subdivision_1_name AS ru_state_name,
  56. pt_br.subdivision_1_name AS pt_state_name,
  57.  
  58. en.subdivision_2_name AS en_province_name,
  59. fr.subdivision_2_name AS fr_province_name,
  60. de.subdivision_2_name AS de_province_name,
  61. zh_cn.subdivision_2_name AS zh_province_name,
  62. es.subdivision_2_name AS es_province_name,
  63. ru.subdivision_2_name AS ru_province_name,
  64. pt_br.subdivision_2_name AS pt_province_name,
  65.  
  66. en.city_name AS en_city_name,
  67. fr.city_name AS fr_city_name,
  68. de.city_name AS de_city_name,
  69. zh_cn.city_name AS zh_city_name,
  70. es.city_name AS es_city_name,
  71. ru.city_name AS ru_city_name,
  72. pt_br.city_name AS pt_city_name,
  73.  
  74. en.time_zone
  75.  
  76. FROM en, fr, de, zh_cn, es, ru, pt_br
  77.  
  78. WHERE en.geoname_id = fr.geoname_id
  79. AND fr.geoname_id = de.geoname_id
  80. AND de.geoname_id = zh_cn.geoname_id
  81. AND zh_cn.geoname_id = es.geoname_id
  82. AND es.geoname_id = ru.geoname_id
  83. AND ru.geoname_id = pt_br.geoname_id

El problema es que nunca termina de ejecutarse... Estoy usando SQLYog Community Edition en Windows 8.1. Lleva casi 1 hora ejecutandose y nada, los archivos csv solo pesan 42mb todas (no se cuanto pesaran ahora que estan metidos en tablas - usando LOAD DATA INFILE)

Gracias!

Edito para añadir estructura de la nueva tabla, y como se juntan todas en la nueva.

Vale el problema es que se me olvido poner primary key para la primera columna (id).


Título: Re: insertar datos de diferentes tablas con left join
Publicado por: Toxico en 31 Julio 2015, 06:15
Has probado al intentar ejecutar el select sin el insert?


Título: Re: insertar datos de diferentes tablas con left join
Publicado por: fran800m en 31 Julio 2015, 20:55
¿Están indizadas las columnas que unen las tablas?

Código:
WHERE en.geoname_id = fr.geoname_id
AND fr.geoname_id = de.geoname_id
AND de.geoname_id = zh_cn.geoname_id
AND zh_cn.geoname_id = es.geoname_id
AND es.geoname_id = ru.geoname_id
AND ru.geoname_id = pt_br.geoname_id