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.

Preguntas similare

Leer las respuestas

#6 Pau Domínguez
22/11/2005 - 13:01 | Informe spam
Gracias Rigo.
Ya encontré la solución que buscaba. La tuya está también bien, pero la otra
es mucho más rápida.
0.192 la buena contra 1.63 la tuya.
En el otro mensaje está la solución.

Gracias de todas formas.
Pau.

"rigo" escribió en el mensaje
news:
Vamos a ver si entendi el problema:
1A y B tienen una relacion maestro detalle pero hay registros en A
sin
detalle en B ( segun la consulta right outer join B on A.FK3 = B.FK1 =>
La tabla A esta relaciona con B por los campos FK3 y FK1
respectivamente).
2. ...en concreto C y D sobre campos de A y E sobre campos de B. Por
consiguiente debe existir una relacion entre B y E.
3. segun observe en la consulta solo quiere visualizar datos de A
(Select distinct a.* )

Yo haria dos query y uniria los resultado:
1. Los registros de A que no tengan detalle
2. los registros de A que tengan detalle en B solo los que cumplan un
filtro en la tabla E.

Es decir:
select A.*
from A
where FK3 not in (select FK1 from B)
UNION
select A.*
from A
where FK3 in ( select FK1
from B inner join E on B.FK2 = E.PK
where condicion sobre campo E)

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida