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
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


0