Consulta SQL con OUTER JOINS que no devuelve lo esperado.

21/11/2005 - 13:24 por Pau Domínguez | Informe spam
Hola a todos.
Tengo un programa que ejecuta una consulta SQL con outer joins que no
devuelve lo que se supone que debería.
El problema es el siguientes.
Tengo una consulta sobre 5 tablas llamemoslas A,B,C,D,E
A y B tienen una relacion maestro detalle pero hay registros en A sin
detalle en B.
Las demás tablas, son tablas maestras que contienen información sobre campos
de A y B en concreto C y D sobre campos de A y E sobre campos de B.
Estas tres tablas están enlazadas con claves primarias y no hay problemas de
integridad referencial en los datos.

La consulta tiene que devolver todos los registros de A y cuando existan
registros detalle en B solo los que cumplan un filtro en la tabla E.

En principio no parecía que tubiera que habler ningún problema la sonsulta
sería algo así:
Select distinct a.*
from A inner join C on A.FK1 = C.PK
inner join D on A.FK2 = D.PK
right outer join B on A.FK3 = B.FK1
right outer join E on b.FK2 = E.PK
where condicion sobre campos de C
and condiciones sobre campos de E

Pues bien, la consulta no devueve los mismos registros si aparacen las
condiciones sobre campos de E como si los omito.
(Las condiciones sobre E incluyen un "or e.campo is null"). Aunque según
entiendo yo, el right outer join obliga a devolver todos los registro de la
tabla A
independientemente de los filtros sobre las tablas de la izquierda, cosa que
no está pasando.

Parece ser que cuando todos los registros detalle que exiten en B no cumplen
el filtro no se muestra tampoco el registro de A.
¿No va esto en contra de lo que se supone que hace el OUTER JOIN?

Gracias.

Pau.
 

Leer las respuestas

#1 Alejandro Mesa
21/11/2005 - 15:08 | Informe spam
Pau Domínguez,

Me parece, segun lo que comentastes, que debes usar "left join" en vez de
"right join".

...
right outer join B on A.FK3 = B.FK1
right outer join E on b.FK2 = E.PK
...


AMB

"Pau Domínguez" wrote:

Hola a todos.
Tengo un programa que ejecuta una consulta SQL con outer joins que no
devuelve lo que se supone que debería.
El problema es el siguientes.
Tengo una consulta sobre 5 tablas llamemoslas A,B,C,D,E
A y B tienen una relacion maestro detalle pero hay registros en A sin
detalle en B.
Las demás tablas, son tablas maestras que contienen información sobre campos
de A y B en concreto C y D sobre campos de A y E sobre campos de B.
Estas tres tablas están enlazadas con claves primarias y no hay problemas de
integridad referencial en los datos.

La consulta tiene que devolver todos los registros de A y cuando existan
registros detalle en B solo los que cumplan un filtro en la tabla E.

En principio no parecía que tubiera que habler ningún problema la sonsulta
sería algo así:
Select distinct a.*
from A inner join C on A.FK1 = C.PK
inner join D on A.FK2 = D.PK
right outer join B on A.FK3 = B.FK1
right outer join E on b.FK2 = E.PK
where condicion sobre campos de C
and condiciones sobre campos de E

Pues bien, la consulta no devueve los mismos registros si aparacen las
condiciones sobre campos de E como si los omito.
(Las condiciones sobre E incluyen un "or e.campo is null"). Aunque según
entiendo yo, el right outer join obliga a devolver todos los registro de la
tabla A
independientemente de los filtros sobre las tablas de la izquierda, cosa que
no está pasando.

Parece ser que cuando todos los registros detalle que exiten en B no cumplen
el filtro no se muestra tampoco el registro de A.
¿No va esto en contra de lo que se supone que hace el OUTER JOIN?

Gracias.

Pau.




Preguntas similares