No consigo resolver consulta sql con inner join

Estoy bastante espero estos días ya que no puedo resolver una consulta que relaciona 1 tabla con 4 más. Menos mal que sigo avanzando por otro lugar, si no... Estaría parado.
Tengo estas tablas:
td_clientes
__________________
id_cliente (pk)
razon
direccion
cod_pais (fk a la tabla td_cod_pais)
cod_comunidad (fk a la tabla td_cod_comunidad)
cod_provincia (fk a la tabla td_cod_provincia)
cod_localidad (fk a la tabla td_cod_localidad)
teniedo solo un cliente en la tabla clientes con estos datos:
2 - cliente de prueba - dirección - 1 - 17 - 1 - 2
td_cod_pais
__________________
id_cod (pk)
descripcion
teniedo solo un país en la tabla con estos datos:
1 - españa
td_cod_comunidad
__________________
id_cod (pk) fk a la tabla td_cod_pais
id_cod2 (pk)
descripcion
en esta tabla están todas las comunidades de españa, la id=17 es comunidad valenciana
td_cod_provincia
__________________
id_cod (pk) fk a la tabla td_cod_pais
id_cod2 (pk) fk a la tabla td_cod_comunidad
id_cod3 (pk)
descripcion
En esta tabla están todas las provincias de españa, la provincia 1 de la comunidad 17 del país 1 es alicante
td_cod_localidad
__________________
id_cod (pk) fk a la tabla td_cod_pais
id_cod2 (pk) fk a la tabla td_cod_comunidad
id_cod3 (pk) fk a la tabla td_cod_provincia
id_cod4 (pk)
Descripción
En esta tabla están algunas localidades. La localidad 2 de la provincia 1 de la comunidad 17 del país 1 es elche
El caso es que quiero que me devuelva a todos los clientes, con la descripción del país, comunidad, provincia y localidad.
Lo hago así:
código: select distinct(id_cliente), razon, direccion,
td_clientes.cod_pais, td_cod_pais.descripcion,
td_clientes.cod_comunidad, td_cod_comunidad.descripcion,
td_clientes.cod_provincia, td_cod_provincia.descripcion,
td_clientes.cod_localidad, td_cod_localidad.descripcion
from td_clientes inner join td_cod_pais on
td_clientes.cod_pais = td_cod_pais.id_cod
inner join td_cod_comunidad on
td_clientes.cod_comunidad = td_cod_comunidad.id_cod2
inner join td_cod_provincia on
td_clientes.cod_provincia = td_cod_provincia.id_cod3
inner join td_cod_localidad on
td_clientes.cod_localidad = td_cod_localidad.id_cod4
order by razon
pero me trae 19 resultados, 1 por cada una de las comunidades que hay (17 + ceuta y melilla)
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - álava - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - albacete - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - alicante - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - almería - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - ávila - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - badajoz - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - barcelona - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - cantabria - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - ceuta - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - com. Foral navarra - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - huesca - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - islas baleares - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - la coruña - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - la rioja - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - las palmas - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - madrid - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - melilla - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - murcia - 2 - elche
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - principado asturias - 2 - elche
Está claro que solo quiero que me de el resultado:
2 - cliente de prueba - dirección - 1 - españa - 17 - comunidad valenciana - 1 - alicante - 2 - elche
pero no lo consigo... Y no se donde tengo el error ya que he probado otras consultas cambiando algunas claves... Pero nada.

3 respuestas

Respuesta
1
El problema es que la porque en las tablas a partir de td_comunidad tienen más de un valor, la quey debería ser:
select distinct(id_cliente), razon, direccion,
td_clientes.cod_pais, td_cod_pais.descripcion,
td_clientes.cod_comunidad, td_cod_comunidad.descripcion,
td_clientes.cod_provincia, td_cod_provincia.descripcion,
td_clientes.cod_localidad, td_cod_localidad.descripcion
from td_clientes
inner join td_cod_pais on
td_clientes.cod_pais = td_cod_pais.id_cod
inner join td_cod_comunidad on
td_clientes.cod_pais = td_cod_comunidad.id_cod and
td_clientes.cod_comunidad = td_cod_comunidad.id_cod2
inner join td_cod_provincia on
td_clientes.cod_pais = td_cod_provincia.id_cod and
td_clientes.cod_comunidad = td_cod_provincia.id_cod2 and
td_clientes.cod_provincia = td_cod_provincia.id_cod3
inner join td_cod_localidad on
td_clientes.cod_pais = td_cod_localidad.id_cod and
td_clientes.cod_comunidad = td_cod_localidad.id_cod2 and
td_clientes.cod_provincia = td_cod_localidad.id_cod3 and
td_clientes.cod_localidad = td_cod_localidad.id_cod4
order by razon
Respuesta
1
Veo un problema de modelo de datos acá porque tenés en la tabla del cliente algunos datos normalizados.
Por ejemplo, si el cliente es de Elche, con el código de elche ya alcanza, porque por joins sacás que Elche es de Alicante, luego con el otro join que es de Valencia...
Tu consulta está bien, no encontré problemas pero creo que si miras el modelo vas a ver algunas referencias circulares que son las que están generando el problema.
Hola, muchas gracias por las molestias que te has tomado.
Ya lo solucioné con la ayuda de otra persona.
No tenía correctamente la consulta.
Un saludo
select distinct(id_cliente), razon, direccion,
td_clientes.cod_pais, td_cod_pais.descripcion,
td_clientes.cod_comunidad, td_cod_comunidad.descripcion,
td_clientes.cod_provincia, td_cod_provincia.descripcion,
td_clientes.cod_localidad, td_cod_localidad.descripcion
from td_clientes
inner join td_cod_pais on
td_clientes.cod_pais = td_cod_pais.id_cod
inner join td_cod_comunidad on
td_clientes.cod_pais = td_cod_comunidad.id_cod and
td_clientes.cod_comunidad = td_cod_comunidad.id_cod2
inner join td_cod_provincia on
td_clientes.cod_pais = td_cod_provincia.id_cod and
td_clientes.cod_comunidad = td_cod_provincia.id_cod2 and
td_clientes.cod_provincia = td_cod_provincia.id_cod3
inner join td_cod_localidad on
td_clientes.cod_pais = td_cod_localidad.id_cod and
td_clientes.cod_comunidad = td_cod_localidad.id_cod2 and
td_clientes.cod_provincia = td_cod_localidad.id_cod3 and
td_clientes.cod_localidad = td_cod_localidad.id_cod4
order by razon
Respuesta
1
segun lo que veo en las estructura que me mandaste solo veo puras pk no se si creaste las llaves foraneas correspondientes si no las creaste debes creaslas para poder que se relaciones ahora prueba sin utilizar el inner join solo en el from le pones las tablas con los alias y las vas relacionando osea from clientes c, pais p, comunidad c, localicad l, provincia pr where c.cod_pais=p.cod_pais and c.cod_provincia=pr.provincia y asi sucesivamente.
Hola, muchas gracias por las molestias que te has tomado.
Ya lo solucioné con la ayuda de otra persona.
No tenía correctamente la consulta.
Un saludo
select distinct(id_cliente), razon, direccion,
td_clientes.cod_pais, td_cod_pais.descripcion,
td_clientes.cod_comunidad, td_cod_comunidad.descripcion,
td_clientes.cod_provincia, td_cod_provincia.descripcion,
td_clientes.cod_localidad, td_cod_localidad.descripcion
from td_clientes
inner join td_cod_pais on
td_clientes.cod_pais = td_cod_pais.id_cod
inner join td_cod_comunidad on
td_clientes.cod_pais = td_cod_comunidad.id_cod and
td_clientes.cod_comunidad = td_cod_comunidad.id_cod2
inner join td_cod_provincia on
td_clientes.cod_pais = td_cod_provincia.id_cod and
td_clientes.cod_comunidad = td_cod_provincia.id_cod2 and
td_clientes.cod_provincia = td_cod_provincia.id_cod3
inner join td_cod_localidad on
td_clientes.cod_pais = td_cod_localidad.id_cod and
td_clientes.cod_comunidad = td_cod_localidad.id_cod2 and
td_clientes.cod_provincia = td_cod_localidad.id_cod3 and
td_clientes.cod_localidad = td_cod_localidad.id_cod4
order by razon

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas