Problemas con Left Join

12/01/2010 - 21:13 por Diego | Informe spam
Buenas Tardes.
Tengo un problema que segun la teoria estoy haciendo lo correcto, pero en la
practica no me muestra los resultados deseados.
Tengo 2 Tablas (Destinos y Tarifas)
les paso las descripciones de ambas
Tabla Destinos Tabla Tarifas
NroDestino NroTarifa
DescripcionDestino Destino
importe

lo que quiero saber es si se cargaron las tarifas para todos los destinos,
entonces hago lo siguiente

select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.importe
from destinos
left join tarifas on destinos.NroDestino=tarifas.Destino

Si no estoy haciendo algo mal, con esta instruccion deberia traerme todos
los Nros de tarifa y destinos en los cuales no se le carga nada, y en caso
mostrarme NULL, pero no lo hace, esta instruccion me esta funcionando como
in inner join.

Tengo algo mal en la instruccion?

Gracias de antemano.
Diego.




__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 4765 (20100112) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
12/01/2010 - 22:20 | Informe spam
Diego,

lo que quiero saber es si se cargaron las tarifas para todos los destinos



O sea, que deseas ver si existe algun destino sin tarifa.

select
destinos.NroDestino,
destinos.DescripcionDestino,
tarifas.NroTarifa,
tarifas.importe
from
destinos
left join
tarifas on destinos.NroDestino=tarifas.Destino
where
tarifas.Destino IS NULL;

Tambien puedes usar el operador EXISTS.

select
destinos.NroDestino,
destinos.DescripcionDestino
from
destinos as d
where
not exists (
select *
from tarifas as t
where t.Destino = d.NroDestino
);


AMB




"Diego" wrote:

Buenas Tardes.
Tengo un problema que segun la teoria estoy haciendo lo correcto, pero en la
practica no me muestra los resultados deseados.
Tengo 2 Tablas (Destinos y Tarifas)
les paso las descripciones de ambas
Tabla Destinos Tabla Tarifas
NroDestino NroTarifa
DescripcionDestino Destino
importe

lo que quiero saber es si se cargaron las tarifas para todos los destinos,
entonces hago lo siguiente

select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.importe
from destinos
left join tarifas on destinos.NroDestino=tarifas.Destino

Si no estoy haciendo algo mal, con esta instruccion deberia traerme todos
los Nros de tarifa y destinos en los cuales no se le carga nada, y en caso
mostrarme NULL, pero no lo hace, esta instruccion me esta funcionando como
in inner join.

Tengo algo mal en la instruccion?

Gracias de antemano.
Diego.




__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 4765 (20100112) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com




.

Respuesta Responder a este mensaje
#2 Alejandro Mesa
12/01/2010 - 22:22 | Informe spam
En la sentencia que usa el operador EXISTS debemos usar el alias correcto en
la lista de columnas.

select
d.NroDestino,
d.DescripcionDestino
from
destinos as d
where
not exists (
select *
from tarifas as t
where t.Destino = d.NroDestino
);


AMB


"Alejandro Mesa" wrote:

Diego,

> lo que quiero saber es si se cargaron las tarifas para todos los destinos

O sea, que deseas ver si existe algun destino sin tarifa.

select
destinos.NroDestino,
destinos.DescripcionDestino,
tarifas.NroTarifa,
tarifas.importe
from
destinos
left join
tarifas on destinos.NroDestino=tarifas.Destino
where
tarifas.Destino IS NULL;

Tambien puedes usar el operador EXISTS.

select
destinos.NroDestino,
destinos.DescripcionDestino
from
destinos as d
where
not exists (
select *
from tarifas as t
where t.Destino = d.NroDestino
);


AMB




"Diego" wrote:

> Buenas Tardes.
> Tengo un problema que segun la teoria estoy haciendo lo correcto, pero en la
> practica no me muestra los resultados deseados.
> Tengo 2 Tablas (Destinos y Tarifas)
> les paso las descripciones de ambas
> Tabla Destinos Tabla Tarifas
> NroDestino NroTarifa
> DescripcionDestino Destino
> importe
>
> lo que quiero saber es si se cargaron las tarifas para todos los destinos,
> entonces hago lo siguiente
>
> select
> destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.importe
> from destinos
> left join tarifas on destinos.NroDestino=tarifas.Destino
>
> Si no estoy haciendo algo mal, con esta instruccion deberia traerme todos
> los Nros de tarifa y destinos en los cuales no se le carga nada, y en caso
> mostrarme NULL, pero no lo hace, esta instruccion me esta funcionando como
> in inner join.
>
> Tengo algo mal en la instruccion?
>
> Gracias de antemano.
> Diego.
>
>
>
>
> __________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 4765 (20100112) __________
>
> ESET NOD32 Antivirus ha comprobado este mensaje.
>
> http://www.eset.com
>
>
>
>
> .
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
13/01/2010 - 15:09 | Informe spam
Alberto Daniel,

Que bueno que lo mencionas, que efecto tiene el outer?



Ningun efecto. Los join Left, Right, y Full son todos outer, y no es
necesario escribirlo en la sentencia. Se dan por hecho que son outer cuando
se usan.

Estas dos sentencias son iguales.

select * from A left join B on A.c1 = B.c1
select * from A left outer join B on A.c1 = B.c1


AMB


"Alberto Daniel" wrote:

Que bueno que lo mencionas, que efecto tiene el outer?
"Gustavo Cantero (The Wolf)" wrote in
message news:%23%
Diego:
Deberias agregar la clusula "outer" de esta manera:

select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.
importe
from destinos
left outer join tarifas on destinos.NroDestino=tarifas.Destino
Suerte!


Gustavo A. Cantero
Scientia Soluciones Informticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar
On 12/01/2010 05:13 p.m., Diego wrote:
select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.
importe
from destinos
left join tarifas on destinos.NroDestino=tarifas.Destino


Respuesta Responder a este mensaje
#4 Alejandro Mesa
13/01/2010 - 17:31 | Informe spam
Alberto Daniel,

Que bueno que lo mencionas, que efecto tiene el outer?



Ningun efecto, pues la palabra "outer" es opcional cuando se usan outer
joins como son Left, right, y Full.

estas dos sentencias returnoran el mismo resultado.

select * from A left join B on A.c1 = B.c1
select * from A left outer join B on A.c1 = B.c1


AMB



"Alberto Daniel" wrote:

Que bueno que lo mencionas, que efecto tiene el outer?
"Gustavo Cantero (The Wolf)" wrote in
message news:%23%
Diego:
Deberias agregar la clusula "outer" de esta manera:

select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.
importe
from destinos
left outer join tarifas on destinos.NroDestino=tarifas.Destino
Suerte!


Gustavo A. Cantero
Scientia Soluciones Informticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar
On 12/01/2010 05:13 p.m., Diego wrote:
select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.
importe
from destinos
left join tarifas on destinos.NroDestino=tarifas.Destino


Respuesta Responder a este mensaje
#5 Diego
15/01/2010 - 16:35 | Informe spam
Hola Alejandro, disculpa en la demora por responderte.
El problema que tengo es que se cargaron los destinos, luego se ingresaron
las tarifas, pero a medida que se va trabajando comienzan a cargar nuevos
destinos.
Mi problema es que para cargar y mostrar las tarifas cargadas utilizo en
Visual Basic 6 una grilla, lo que quiero hacer es que cuando pidan la tarifa
cargada, les muestre todos los destinos con sus respectivas tarifas, e
incluso los nuevos destinos cargados pero con el casillero correspondiente
en blanco para que el usuario sepa que es lo que tiene que cargar.
Te doy un ejemplo:

Tabla Destinos

NroDestino DescDestino
1 Montevideo
2 Rio de Janeiro
3 Santiago de chile
Tabla Tarifas
NroTarifa Destino Importe
1 1 10
1 2 20
1 3 30

Cuando llaman a la tarifa 1 en pantalla muestro lo siguiente
Montevideo 10
Rio de Janeiro 20
Santiago de Chile 30

El problema mio es que cargan un nuevo destino por ejempo Barranquilla y yo
quiero que cuando pidan la tarifa muestre lo suiguente
Montevideo 10
Rio de Janeiro 20
Santiago de Chile 30
Barranquilla Este obviamente sin valor

Por mis conocimientos de sql con la instruccion select con left join que
mencione me lo deberia mostrar, pero no lo hace.
Tendre mal la instruccion?

Gracias por todo.

"Alejandro Mesa" escribió en el
mensaje news:
Diego,

lo que quiero saber es si se cargaron las tarifas para todos los destinos



O sea, que deseas ver si existe algun destino sin tarifa.

select
destinos.NroDestino,
destinos.DescripcionDestino,
tarifas.NroTarifa,
tarifas.importe
from
destinos
left join
tarifas on destinos.NroDestino=tarifas.Destino
where
tarifas.Destino IS NULL;

Tambien puedes usar el operador EXISTS.

select
destinos.NroDestino,
destinos.DescripcionDestino
from
destinos as d
where
not exists (
select *
from tarifas as t
where t.Destino = d.NroDestino
);


AMB




"Diego" wrote:

Buenas Tardes.
Tengo un problema que segun la teoria estoy haciendo lo correcto, pero en
la
practica no me muestra los resultados deseados.
Tengo 2 Tablas (Destinos y Tarifas)
les paso las descripciones de ambas
Tabla Destinos Tabla Tarifas
NroDestino NroTarifa
DescripcionDestino Destino
importe

lo que quiero saber es si se cargaron las tarifas para todos los
destinos,
entonces hago lo siguiente

select
destinos.NroDestino,destinos.DescripcionDestino,tarifas.NroTarifa,tarifas.importe
from destinos
left join tarifas on destinos.NroDestino=tarifas.Destino

Si no estoy haciendo algo mal, con esta instruccion deberia traerme todos
los Nros de tarifa y destinos en los cuales no se le carga nada, y en
caso
mostrarme NULL, pero no lo hace, esta instruccion me esta funcionando
como
in inner join.

Tengo algo mal en la instruccion?

Gracias de antemano.
Diego.




__________ Información de ESET NOD32 Antivirus, versión de la base de
firmas de virus 4765 (20100112) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com




.




__________ Informacin de ESET NOD32 Antivirus, versin de la base de firmas
de virus 4772 (20100114) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com








__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 4772 (20100114) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida