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ó:

Hola, no te entiendo bien, pero en el where estas poniendo =1 que es realmente lo que buscas, podrias poner un ejemplo?



-
MVP SQL SERVER
Buenos Aires - Argentina
www.sqlgurus.org
-
"anonimo" escribió en el mensaje news:
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
Respuesta Responder a este mensaje
#2 anonimo
05/01/2006 - 01:57 | Informe spam
muchas gracias..!!!!

"Maxi [MVP]" escribió:

OK, Ahora si :-)

select nombre, numtel
from persona
left join (select * from tipo_telefono where tiptel='1') tx on
persona.idpersona=tx.idpersona





-
MVP SQL SERVER
Buenos Aires - Argentina
www.sqlgurus.org
-
"anonimo" escribió en el mensaje news:
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ó:

> Hola, no te entiendo bien, pero en el where estas poniendo =1 que es realmente lo que buscas, podrias poner un ejemplo?
>
>
>
> -
> MVP SQL SERVER
> Buenos Aires - Argentina
> www.sqlgurus.org
> -
> "anonimo" escribió en el mensaje news:
> 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
Respuesta Responder a este mensaje
#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:

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.
Respuesta Responder a este mensaje
#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:
muchas gracias..!!!!

"Maxi [MVP]" escribió:

OK, Ahora si :-)

select nombre, numtel
from persona
left join (select * from tipo_telefono where tiptel='1') tx on
persona.idpersona=tx.idpersona





-
MVP SQL SERVER
Buenos Aires - Argentina
www.sqlgurus.org
-
"anonimo" escribió en el mensaje
news:
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ó:

> Hola, no te entiendo bien, pero en el where estas poniendo =1 que es
realmente lo que buscas, podrias poner un ejemplo?
>
>
>
> -
> MVP SQL SERVER
> Buenos Aires - Argentina
> www.sqlgurus.org
> -
> "anonimo" escribió en el
mensaje news:
> 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
Respuesta Responder a este mensaje
#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ó:

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:
> muchas gracias..!!!!
>
> "Maxi [MVP]" escribió:
>
>> OK, Ahora si :-)
>>
>> select nombre, numtel
>> from persona
>> left join (select * from tipo_telefono where tiptel='1') tx on
>> persona.idpersona=tx.idpersona
>>
>>
>>
>>
>>
>> -
>> MVP SQL SERVER
>> Buenos Aires - Argentina
>> www.sqlgurus.org
>> -
>> "anonimo" escribió en el mensaje
>> news:
>> 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ó:
>>
>> > Hola, no te entiendo bien, pero en el where estas poniendo =1 que es
>> realmente lo que buscas, podrias poner un ejemplo?
>> >
>> >
>> >
>> > -
>> > MVP SQL SERVER
>> > Buenos Aires - Argentina
>> > www.sqlgurus.org
>> > -
>> > "anonimo" escribió en el
>> mensaje news:
>> > 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



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida