FULL JOIN

07/04/2008 - 23:53 por Penta | Informe spam
Estimados.
Utilizo SS2000 SP4
Tengo una duda sobre el funcionamiento del FULL JOIN

create table T1
(
ID int,
ano int
)

create table T2
(
ID int,
ano int
)

insert into t1 values (1,2008)
insert into t2 values (2,2007)
insert into t2 values (3,2008)

En un principio pense que con esta query me daria todos los registros
del 2008 de ambas tablas
select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08

Pudiendo comprobar que NO es asi, y con la siguiente consulta si lo
hace

select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08 or t2.ano 08

Entiendo porque la 2da query me trae los datos, pero pense que al FULL
JOIN no tenia que especificarle el or

Atte.
Penta.

Preguntas similare

Leer las respuestas

#1 Maxi Accotto
08/04/2008 - 01:50 | Informe spam
Hola Estimado, creo que tiene un concepto erroneo.
El full es equivalente a traer de ambos lados y eso funciona.
Con su mismo ejemplo ejecute esto:


select * from t1 FULL join t2
on t1.id=t2.id

Usted vera que la union es por id verdad? pero trae 3 registros cuando en
realidad no hay esa combinacion ya que no hay combinacion entre ID.
Usted luego pone un filtro y ese filtro si lo hace solo sobre una tabla y a
la otra no le indica null o bien como usted hizo entonces es logico el
filtrado y los resultados que le esta mostrando.

No se si lo confundi mas o lo ayude :-S


Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Penta" escribió en el mensaje de
noticias:
Estimados.
Utilizo SS2000 SP4
Tengo una duda sobre el funcionamiento del FULL JOIN

create table T1
(
ID int,
ano int
)

create table T2
(
ID int,
ano int
)

insert into t1 values (1,2008)
insert into t2 values (2,2007)
insert into t2 values (3,2008)

En un principio pense que con esta query me daria todos los registros
del 2008 de ambas tablas
select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08

Pudiendo comprobar que NO es asi, y con la siguiente consulta si lo
hace

select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08 or t2.ano 08

Entiendo porque la 2da query me trae los datos, pero pense que al FULL
JOIN no tenia que especificarle el or

Atte.
Penta.


Respuesta Responder a este mensaje
#2 Carlos M. Calvelo
08/04/2008 - 02:30 | Informe spam
Hola Penta,

On 7 apr, 23:53, Penta wrote:
Estimados.
Utilizo SS2000 SP4
Tengo una duda sobre el funcionamiento del FULL JOIN

create table T1
(
ID int,
ano int
)

create table T2
(
ID int,
ano int
)

insert into t1 values (1,2008)
insert into t2 values (2,2007)
insert into t2 values (3,2008)

En un principio pense que con esta query me daria todos los registros
del 2008 de ambas tablas
select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08

Pudiendo comprobar que NO es asi, y con la siguiente consulta si lo
hace

select * from t1 FULL join t2
on t1.id=t2.id
Where t1.ano 08 or t2.ano 08

Entiendo porque la 2da query me trae los datos, pero pense que al FULL
JOIN no tenia que especificarle el or




Vamos a ver... tu consulta consiste en tres partes que te pongo aquí
abajo en su orden lógico de ejecución. Digo en orden *lógico* porque
ese es el orden en el que tu tienes que pensar que se ejecutan. Lo
cual no quiere decir que el SGBD no pueda hacer varias cosas
simultaneamente en realidad. El caso es que haga como lo haga el
resultado será siempre el mismo al que se obtiene aplicando este
orden lógico. Cada parte tiene como resultado una tabla intermedia
que es la tabla que se le ofrece a la siguiente parte.

1) from t1 full join t2 on t1.id=t2.id

Resultado:
t1.ID t1.ano t2.ID t2.ano
NULL NULL 2 2007
NULL NULL 3 2008
1 2008 NULL NULL

Si no entiendes el join (inner, left, right y full) es hora de
leer bien la ayuda.
Esta tabla intermedia es lo que se le ofrece al segundo paso
(el where)

2) where t1.ano 08

Resultado:
t1.ID t1.ano t2.ID t2.ano
1 2008 NULL NULL

Solo había un registro en la tabla intermedia anterior con
t1.ano 08

Esta segunda tabla intermedia se le ofrece al siguiente paso
(el select).

3) select *

Selecciona columnas de la última tabla intermedia,
en este caso todas (*)

Resultado:
t1.ID t1.ano t2.ID t2.ano
1 2008 NULL NULL

Aplica tu ahora las mismas reglas con tu segunda consulta
y todo quedará muy requeteclaro (supongo).

Si en tu consulta tuvieras además un group by y un having,
estos serían los pasos 3) y 4) antes de llegar al select,
que sería 5)

Saludos,
Carlos
Respuesta Responder a este mensaje
#3 Penta
08/04/2008 - 15:28 | Informe spam
Estimados.
Ha quedado muy claro, no habia considerado el NULL :(
Solo con esta sentencia FULL no tenia claridad.

Y gracias a ambos por aclararme la duda.

Atte.
Penta.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida