Bases de Datos - Not IN - Not EXISTS - OUTER JOIN

   
Vista:

Not IN - Not EXISTS - OUTER JOIN

Publicado por Axjok (3 intervenciones) el 17/02/2009 17:56:19
Tengo una consulta en donde hay 4 a 5 CASE que deben tomar cierto valor dependiendo si cumple ciertas instrucciones. En una de ellas necesito saber si el CAMPO AA de la tabla origen esta dentro del CAMPO XX de otra tabla.
En estos momentos estoy usando NOT IN, la cual funciona bien pero todos sabemos que el tiempo de respuesta es o puede ser muy largo. Entonces si utilizo un NOT EXISTS es buena idea pero no logro lanzarlo porque esta misama condicion debo cumpliar para 4 datos mas , es decir :
- CAMPO AA de la tabla origen esta dentro del CAMPO XX de otra tabla
- CAMPO BB de la tabla origen esta dentro del CAMPO XX de otra tabla
- CAMPO CC de la tabla origen esta dentro del CAMPO XX de otra tabla
Por este motivo no puedo utilizarlo o he hallado como realizarlo, puesto que en mi Sentencia tengo unos left join, y la referencia de NOT EXISTS va en el WHERE.
Al usar un OUTER JOIN me funciona pero no se como hacerlo para mas de 1 dato, es decir, lo que necesito es:
- LEFT OUTER JOIN tabla3 ON tabla1.CAMPO AA = tabla3.CAMPO XX
- LEFT OUTER JOIN tabla3 ON tabla1.CAMPO BB = tabla3.CAMPO XX
- LEFT OUTER JOIN tabla3 ON tabla1.CAMPO CC = tabla3.CAMPO XX

Es decir repetir la sentencia mas de una vez, y es ahy donde tengo el problema. La sentencia es:

1. NOT IN
select
CASE
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 AND t1.oc NOT IN
(SELECT oc FROM tabla3 WHERE tipo = '1') THEN 4
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 THEN 1
ELSE 5
END AS acc_ind
from tabla1 t1
left join tabla t2 ON t1.code = t2.code
where t2.tipo = 3

Esto funciona con todos los cases, pero se demora mucho.

2. OUTER JOIN
select
CASE
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 AND t3.oc IS null THEN 4
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 THEN 1
ELSE 5
END AS acc_ind
from tabla1 t1
left join tabla t2 ON t1.code = t2.code
LEFT OUTER JOIN TABLA3 t3 ON t1.oc = t3.oc and t2.tipo='1'
where t2.tipo = 3

Estos funciona porque al comparar t1.oc = t3.oc con outer join si t1.oc no es igual a t3.oc asigna un valor null a t3.oc.
Sin embargo esto slo me funicona con una case y debo repetirlo para 4 cases mas, teniendo 2 posibiliadades pasar el on del outer join al case, o añadir las demas sentencia al on pero de este forma como asigno un nombre a T3.OC de cada condicion:

CASE
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 AND FLAG1 IS null THEN 4
end
CASE
WHEN t1.cod_acc IS NOT NULL AND t1.cod_tariff = 0 AND FLAG2 IS null THEN 4
end

LEFT OUTER JOIN TABLA3 t3 ON (t1.oc = t3.oc and t2.tipo='1') as FLAG1 or (t1.oc2 = t3.oc and t2.tipo='1') as FLAG2

Esto no puede hacerse, o si?

3. Not Exists

Esto no puedo realizarlo simplemente por el mismo error de el punto 2
el filtro va en el where y yo debo asignar todos mis filtros al where o al case, sin obtener repuesta.

En sintesis hya alguna forma de automatizar el NOT de mi sentencia:

SELECT
CASE
CODE1 NOT IN (SELECT CODE FROM TABLA3 WHERE TIPO = '1') THEN 4
END AS PSS,

CASE
CODE2 NOT IN (SELECT CODE FROM TABLA3 WHERE TIPO = '1') THEN 4
END AS PTT

FROM TABLA1
left join TABLA2 ON TABLA1.D_CODE = TABLA2.D_CODE
where TABLA2.TIPO = 3
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
información
Otras secciones de LWP con contenido de Bases de Datos
- Cursos de Bases de Datos
- Temas de Bases de Datos
información
Cursos y Temas de Bases de Datos
- Tutorial de Bases de datos
- Ficheros y Bases de Datos
- Introducción a las Bases de Datos

RE:Not IN - Not EXISTS - OUTER JOIN

Publicado por LEopoldo Taylhardat (183 intervenciones) el 18/02/2009 13:13:16
Saludos...
Podrìas usar funciones de la BD para desmembrar la sentencia...
Es decir cada exists o not exists puede ser una función que te devuelve 0 o 1 dependiendo de la bùsqueda....
Create function f_valida1....@valor [char, integer,...]...
declare @sino integer;
If exists (select ....) then
set @sino=1;
else
set @sino=0;
end if;
return @sino;
end;
...
En tu select ....
Select....
from...
where
...
and f_valida1=1
and f_valida2=1
....;

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Not IN - Not EXISTS - OUTER JOIN

Publicado por AXJOK (3 intervenciones) el 18/02/2009 15:49:28
Hola, Gracias
Ya habia pensado hacer una funcion, peor mi duda es como llamarla dentro del CASE:

SELECT CASE WHE XXX IS NOT NUL AND NOM_FUNCION(PARAMETRO) = 1 THEN 'ALGO'
END

SERIA ASÍ?

SALUDOS............
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar