consulta sql

04/01/2006 - 23:29 por anonimo | Informe spam
tengo un problema.espero puedan ayudarme
tengo dos tablas una es persona y la otra telefono_persona, lo que necesito
es obtener los datos de las personas + el campo de numero_telefono (numero de
casa) de la tabla telefono_persona, en la tabla telefono_persona esta el
campo tipo_telefono (casa, trabajo, etc) he estado haciendo lo siguiente:
select tb1.nombre, tb2.numtel
from persona tb1
left outer join telefono_persona tb2 on tb1.codpersona= tb2.codpersona where
tb2.tipo_telefono='1'

pero eso me restringe al conjunto de resultados de las personas que tengan
numero de telefono ='1', yo lo que quiero es todas las personas + el numero
telefono casa si es que lo tienen

gracias de antemano.

Preguntas similare

Leer las respuestas

#1 anonimo
05/01/2006 - 00:36 | Informe spam
ok, gracias por responder.

te copio las tablas ...
tabla persona
idpersona nombre
1 a
2 b
3 c
4 d
5 e
6 f

tabla telefono_persona
idpersona numtel tiptel
3 145678 1
2 445668 2


cuando ejecuto:
select nombre, numtel
from persona
left outer join tipo_telefono on persona.idpersona=tipo_telefono.idpersona
where tiptel='1'

me retorna:
nombre numtel
c 145678

que como me dices en parte esta bien porque me retorna las personas con el
tipo de telefono =1 pero lo que quiiero es que me retorne todas las personas
de la tabla + el tipo telefono = 1 en caso lo tuviera sino que retorne vacio.

gracias por tu ayuda.



"Maxi [MVP]" escribió:

Mostrar la cita
#2 anonimo
05/01/2006 - 01:57 | Informe spam
muchas gracias..!!!!

"Maxi [MVP]" escribió:

Mostrar la cita
#3 Alejandro Mesa
05/01/2006 - 15:11 | Informe spam
anonimo,

La idea con la que empezastes la consulta esta correcta, solo que en vez de
filtrar en la clausula "where" (por eso restringes el resultado final), debes
usar la condicion en el "join".

select
tb1.nombre,
tb2.numtel
from
persona tb1
left outer join
telefono_persona tb2
on tb1.codpersona= tb2.codpersona and tb2.tipo_telefono='1'
go


AMB



"anonimo" wrote:

Mostrar la cita
#4 qwalgrande
05/01/2006 - 18:47 | Informe spam
Hola.

Con el permiso de Maxi, y aunque en este caso es más que posible que el plan
de ejecución sea idéntico, en otros casos no lo es y considero oportuno
indicar un par de apuntes sobre este tema, con fines esencialmente
pedagógicos.

Cuando unes dos tablas con un "left join", estás solicitando las columnas de
la primera tabla y, en el caso de que coincidan, las columnas de la segunda
tabla. Si no hay coincidencia (si la persona no tiene un teléfono asignado),
pues te devolverá los registros de la primera tabla y nulos en el resto de
columnas. Si en la parte del "where" indicas una condición que afecte a la
segunda tabla, estás convirtiendo tu "left join" en un "inner join".

Para evitar eso, tienes dos formas. Una es la que expuso Maxi. Pero yo
prefiero indicar la relación en la parte del "from", de la siguiente forma:

select nombre, numtel
from persona
left join tipo_telefono tx on persona.idpersona=tx.idpersona and
tiptel='1'

Esta otra forma permite evitar el uso de una subselect que, aunque en
determinadas ocasiones es esta vía la que permite un mejor rendimiento, es
algo que hay que utilizar con sumo cuidado, sobre todo en casos de planes de
ejecución complejos.

En casos sencillos como este, podrás observar que el plan de ejecución es el
mismo.

Alberto López Grande (qwalgrande)
"anonimo" escribió en el mensaje
news:
Mostrar la cita
#5 anonimo
05/01/2006 - 22:00 | Informe spam
muchas gracias por la observacion.
Una pregunta adicional, como haría la sentencia si la persona tuviera
mas de un mismo tipo_telefono=1 registrado. para que solo devuelva uno de
elloscualquiera sea.

gracias.

"qwalgrande" escribió:

Mostrar la cita
Ads by Google
Search Busqueda sugerida