PDA

Ver la Versión Completa : consulta SQL que me resulta compleja


j2mg
28-05-2003, 20:30:03
Buenas tardes.

Pretendo preguntarles por una consulta SQL que haga lo siguiente:

Sea que tengamos 4 tablas. personas, telefonos, direcciones, identificadores

personas la clave es codper numerico, unico y mas campos.

telefonos una clave externa es codper y numtel (una persona puede tener uno, muchos o ningún telefono)y codide para el identificador

direcciones una clave externa es codper y direc (una persona puede tener una, muchas o ninguna dirección) y codide para el identificador

identificadores, es una tabla con clave codide y nombre, sirve para tener una misma identificación por ejemplo, telefono y dirección privados, del trabajo, movil ..... amante, jeje

bueno, uana persona puede tener telefonos y direcciones asignados con codper con los mismos y o diferentes codide (despachos con telefonos, vacaciones sintelefono y moviles sin dirección)

quiero y no logro....... una consulta que lo resuelva y para un codper dado resuelva las cobinaciones ejemplo....


nombre numtel direccion

domicilio 1111111111 sucasa
movil 121212121 null
vacacion null en la cabaña
despacho 132323232 una direccion
despacho2 134434343 otra direccion

son los nulos los que no logro ni con outer join ni suplicando


¿me echais una mano?

jceluce
28-05-2003, 21:01:36
A ver, a ver... como tu ejemplo sin los identificadores...

select p.nombre, t.numtel, d.direc
from (personas.p left join telefonos t on (p.codper = t.codper))
left join direcciones d on (p.codper = d.codper)

Ahora con los identificadores...

select p.nombre, t.numtel, d.direc,
i.nombre as tel_iden, j.nombre as dir_iden
from (((personas.p left join telefonos t on p.codper = t.codper)
left join direcciones d on p.codper = d.codper)
join identificadores i on t.codide = i.codide)
join identificadores j on d.codide = j.codide

no lo he probado pero creo que va a andar :-)

j2mg
28-05-2003, 21:50:32
Estimado amigo.

Te agradezco que hayas contestado tan rápido.....

ese camino que propones .... ya lo anduve.

Voy a preparar un ejemplo y te lo envio ¿ok?

Muchas gracias

j2mg
28-05-2003, 23:19:24
Bueno veamos este ejemplo

telefonos codper codide telefono
4 1 1111
4 2 2222
4 3 3333

direcciones codper codide direccion
4 1 calle1
4 4 calle 4
la consulta:
select t.codide, t.telefono, d.direccion
from telefonos t left join direcciones d
on t.codide=d.codide
where t.codper=4 and d.codper=4

que es del estilo de las que me propones, solo logra obtener el registro presente en las dos tablas de codide=1

igual que esta otra mas sencilla:
select t.codide, t.telefono, d.direccion
from telefonos t left join direcciones d
on t.codide=d.codide
where t.codper=4 and d.codper=4
pero como lo que pretendo obtener es

t.codide telefono direccion d.codide
1 1111 calle 1 1
2 2222 null null
3 3333 null null
null null calle 2 4

es como si faltaran sucesivamente tras dos consultas sencillas...

select codide, telefono
from telefonos
where codper=4 and codide not in
(select codide from direcciones where codper=4)

que devuelve los dos telefonos sin direccion y


select codide, direccion
from direcciones
where codper=4 and codide not in
(select codide from telefonos where codper=4)

que entrega la direccion sin telefono.........

Lo que no se hacer es lograrlo de una sola consulta

¿Puedes echarme otra mano?

Gracias Juan

(Si estaré torpe que es la segunda vez que lo pierdo)

jceluce
29-05-2003, 00:53:26
Ah, si, si..esta vez va probado...

select t.codide, t.telefono, d.direccion, d.codide
from telefonos t full outer join direcciones d on (t.codide = d.codide)
where
(t.codper = 4) or (d.codper = 4)

Espero te ayude

j2mg
29-05-2003, 22:50:13
Buenas noches.

¡Claro que si! Acabo de entrar, y he visto como Javier resolvió acertadadmente el problema. Enhorabuena.

Yo también, encontré una solución que te expongo a continuación.

select i.nombre, t.telefono, d.direccion
from (((personas p left join telefonos t
on p.codigo = t.codper )
full join direcciones d
on d.codper = p.codigo and d.codide=t.codide)),
identificadores i
where i.codigo=t.codide and p.codigo=4 or d.codper=4 and i.codigo=d.codide

El truco está en usar la tabla de personal que marcará los registros a listar, un encuentro externo por los dos lados para obtener los telefonos sin dirección y lo contrario

Así que estoy muy contento

Un saludo a todos y en especial a Javier que se lo ha ganado con su buen royo y su interés

Hasta otra.