![]() |
consulta SQL que me resulta compleja
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? |
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 :-) |
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 |
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) |
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 |
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. |
La franja horaria es GMT +2. Ahora son las 04:42:49. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi