Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Coordinar dos tablas (https://www.clubdelphi.com/foros/showthread.php?t=93149)

Angel.Matilla 30-05-2018 13:36:09

Coordinar dos tablas
 
Sé que tiene que ser una tontería; estoy completamente convencido, pero no soy capaz de encontrar la solución. A ver si soy capaz de explicarme.

Tengo una unas tablas de una BB.DD. migradas desde otra de Access.Una vez hecha la migración una de las tablas tiene este contenido:

Cita:

Municipio Partido
6 2
6 3
6 4
6 18
La otra tabla que he de coordinar tiene estos valores:

Cita:

Municipio Partido
6 2
6 3
6 4
6 1
Y el problema me viene con este último valor. Cuando tengo que buscar los datos de ambas tablas para hacer un informe este último no soy capaz de encontrarlo. De una cosa sí estoy seguro y es que en esta segunda tabla ese valor 1 tendría que ser 18 como en la primera, pero no se me ocurre como encajar los datos de la primera en la segunda.


Entre las posibles soluciones pensé busco en la segunda tabla aquellos valores de la primera que no estén y reemplazo unos por otros, pero no sé como hacer un query que me saque esas diferencias, por que este que se me ocurrió:
Código:

SELECT DISTINCT A.Municipio, A.Partido, B.Partido
  FROM Tabla1 A, Tabla2 B
 WHERE A.Municipio = B.Municipio
  AND A.Partido <> B.Partido
  AND A.Municipio = 6

Me devuelve cosas como esta:
Cita:

Municipio A.Partido B.Partido
6 2 1
6 2 3
6 2 4
6 3 1
6 3 2
6 3 4 etc.
Llevo dos días tratando de encontrar una solcuión que me dé esos dos valores, y sólo ambos, pero no se me ocurre como.

Casimiro Notevi 30-05-2018 13:58:07

No me ha quedado muy claro de lo que quieres conseguir, ¿todas las diferentes municipio/partido?
Código:

6 ---  2
6 ---  3
6 ---  4
6 --- 18
6 ---  1


TOPX 30-05-2018 15:01:31

Cita:

Empezado por Casimiro Notevi (Mensaje 526708)
No me ha quedado muy claro de lo que quieres conseguir, ¿todas las diferentes municipio/partido?

Si es así, en casi cualquier motor de base de datos, sería con algo como:
Código SQL [-]
select Municipio, Partido
from Tabla1
union 
select Municipio, Partido
from Tabla2
Por si acaso, el Sql Fiddle está en ~
http://sqlfiddle.com/#!18/47ecd/2
-

bucanero 30-05-2018 16:24:27

con esta consulta obtienes los registros de la tabla1 que no están o no coinciden con los de la tabla2:
Código SQL [-]
select tabla1.*
from tabla1
left join tabla2 on tabla2.municipio = tabla1.municipio and tabla2.partido = tabla1.partido
where tabla2.partido is null

Y aquí una variante donde hace la unión de las dos tablas y buscas los registros que no están en ambas tablas

Código SQL [-]
select *
from (
 select *
 from tabla1
 union 
 select *
 from tabla2
 group by municipio, partido
) dat 
left join tabla1 on tabla1.municipio = dat.municipio and tabla1.partido = dat.partido
left join tabla2 on tabla2.municipio = dat.municipio and tabla2.partido = dat.partido
where tabla1.partido is null or tabla2.partido is null

Angel.Matilla 30-05-2018 18:05:27

Gracias por vuestras respuestas.
Cita:

Empezado por Casimiro Notevi (Mensaje 526708)
No me ha quedado muy claro de lo que quieres conseguir, ¿todas las diferentes municipio/partido?

Sabía yo que no iba a ser fácil explicarlo, y es que es enrevesado. No es todas las diferentes municipio/partido de ambas tablas; son aquellas en las que en ambas tablas no coincidan esas parejas. Dicho de otra forma: Para el ejemplo que he puesto tendría que salir una única fila de ambas tablas. De la primera el par 6/18 y de la segunda el par 6/1.

Es una gestión de resultados electorales y el problema viene de la BB.DD. original en Access. Mientras en la definición de partidos políticos participantes en un proceso tiene definidas siete posibles partidos, a la hora de grabar los cargos electos (concejales) hay 15 ó 20 formaciones diferentes y como en la definición original no hay hueco para tantos, en los electos al no poder indicar el partido pone un valor por defecto pero que puede ser diferente en cada caso.

Cita:

Empezado por bucanero (Mensaje 526713)
con esta consulta obtienes los registros de la tabla1 que no están o no coinciden con los de la tabla2:

Gracias por la idea. No he probado el código (sinceramente no se me había ocurrido), pero me creo que no va a funcionar bien porque en ningún caso el campo partido está vacío; siempre tiene datos, lo que pasa es que el identificador de partido en la tabla2 puede o no estar en la tabla1.

Cita:

Empezado por TOPX (Mensaje 526710)
Si es así, en casi cualquier motor de base de datos

Menos aun. Y esto sí lo he probado: Así saco todos los que haya en AMBAS tablas. Yo necesito, de forma simultánea, los que estén sólo en una de ellas. Por eso decía al principio de la respuesta que me hacen falta las dos parejas 6/18 y 6/1, porqué sé seguro que en la tabla2 el partido de código 1 para el muncipio 6, corresponde SEGURO en la tabla 1 al pártido de código 18 apra el municipio 6. Esto, claro está, siempre que haya en las dos tablas el mismo número de partidos.

Casimiro Notevi 30-05-2018 18:08:21

Ummm... pero entonces, para que lo tengamos claro, ¿qué resultado esperas obtener exactamente con tu ejemplo?

Angel.Matilla 30-05-2018 18:20:14

Cita:

Empezado por bucanero (Mensaje 526713)
Y aquí una variante donde hace la unión de las dos tablas y buscas los registros que no están en ambas tablas

No sale exactamente lo que busco, pero se empieza a aproximar bastante a lo que me hace falta. Muchísimas gracias.

Casimiro Notevi 30-05-2018 18:43:00

Cita:

Empezado por Casimiro Notevi (Mensaje 526720)
Ummm... pero entonces, para que lo tengamos claro, ¿qué resultado esperas obtener exactamente con tu ejemplo?

:rolleyes::rolleyes::rolleyes::)

Angel.Matilla 30-05-2018 18:44:53

Cita:

Empezado por Casimiro Notevi (Mensaje 526720)
Ummm... pero entonces, para que lo tengamos claro, ¿qué resultado esperas obtener exactamente con tu ejemplo?

Lo que te he comentado: las dos parejas 6/18 (de la tabla1) y 6/1 (de la tabla2). Lo cierto es que la BB.DD. original en Access es un poco rara:
  • En una tabla tiene guardados los procesos electorales: tipo (muncipales, autónomicas, generales...), su fecha y hasta siete formaciones políticas Ele_Part1...Ele_Part7 (en casi todas el último valor es Otros, para los que no están codificados).
  • En una segunda tabla guarda el recuento de votos de una forma similar: localidad y Vot_P1...Vot_P7 para cada uno de los procesis
  • En otra tabla más (y sólo para las últimas elecciones muncipales) están los concejales que saca cada partido en cada municipio (NCo_P1...NCo_P7).
El partido Ele_Part1 se refleja en Vot_P1 y NCo_P1, etc. Con eso si hay un séptimo u octavo valor no codificado en la primera de ellas, en la segunda se va por defecto al valor Otros. De estó me di cuenta después de migrar las tablas en Access (una de estas dos tablas tiene como 50.000 registros), pero me he dado cuenta que en muchos casos si hay en esa primera tabla existe la codificación del partido, pero la captura de datos está mal hecha. Está claro que si en la tabla donde se codifican los partidos tengo cinco entradas y en la de resultados hay cuatro y una de ellas es Otros, no tengo forma de saber a quien corresponde realmente. Pero aunque eso es problema del usuario final, tengo que facilitarles la mayor cantidad de información,

Adaptando el segundo código de bucanero ya encontré una solución que se acerca bastante a lo que me hace falta.

duilioisola 31-05-2018 17:52:58

A ver si esto te ayuda:
https://firebird21.files.wordpress.c..._sql_joins.jpg

Casimiro Notevi 31-05-2018 19:28:03

Cita:

Empezado por duilioisola (Mensaje 526747)

¡Qué bueno!

Angel.Matilla 01-06-2018 09:46:31

Cita:

Empezado por duilioisola (Mensaje 526747)

Muy bueno. Dos cosas: primero que varias de esas combinaciones no las conocía y segundo que, ¡por fin!, he visto que los famosos diagramas de Ven valen para algo :D


La franja horaria es GMT +2. Ahora son las 16:16:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi