Cara, muitíssimo obrigado. Funcionou perfeitamente.
Mas já q estamos na discussão, vamos pensar em termo de performance.
As queries que eu tenho aqui são muito grandes. Elas tem várias sub queries envolvidas. Com este exemplo q você me passou, eu consegui isolar a subquery de uma subquery, que se repetia em vários pontos. Acho q só aí já vai melhorar bastante.
Mas dê uma olhada na consulta abaixo. Ela é grande mas é só pra exemplificar a estrutura das queries que eu tenho. Repare que existem várias subqueries para gerar o meu resultado.
Selecionar tudo
SELECT To_Char(aux.dat_inicio,'DD/MM/YYYY')AS dat_inicio,
Round( sum((NVL (fecdecProg.valdec,0) - NVL (transfProg.valtrans,0)) / DECODE (cc.pot,NULL,1,0,1,cc.pot)),10) AS Dec_Prog,
Round(sum ((NVL (fecdecAcid.valdec,0) - NVL (transfAcid.valtrans,0)) / DECODE (cc.pot,NULL,1,0,1,cc.pot) ),10) AS Dec_Acid,
Round ( Sum (((NVL (fecdecProg.valdec,0) - NVL (transfProg.valtrans,0)) / DECODE (cc.pot,NULL,1,0,1,cc.pot) ) +
((NVL (fecdecAcid.valdec,0) - NVL (transfAcid.valtrans,0)) / DECODE (cc.pot,NULL,1,0,1,cc.pot))),10) AS DEC_Total,
Round(Sum(((NVL (fecdecAcid.valfec,0) ) / DECODE (cc.pot,NULL,1,0,1,cc.pot))),10) AS Fec_Acid,
Round(Sum(((NVL (fecdecProg.valfec,0) ) / DECODE (cc.pot,NULL,1,0,1,cc.pot))),10) AS Fec_Prog,
Round(sum(((NVL (fecdecProg.valfec,0) ) / DECODE (cc.pot,NULL,1,0,1,cc.pot)) +
((NVL (fecdecAcid.valfec,0) ) / DECODE (cc.pot,NULL,1,0,1,cc.pot))),10) as Fec_Total,
Round(Sum(Nvl(freqProg.fProg,0)),4) AS Frequencia_Programada,
Round(Sum(Nvl(freqAcid.fAcid,0)),4) AS Frequencia_Acidental,
Round(Sum(Nvl(freqProg.fProg,0)) + Sum(Nvl(freqAcid.fAcid,0)),4)AS Frequencia_total
FROM ttipotrecho tr,
( SELECT (SUM (qtd_cons_distr +qtd_cons_prim +qtd_cons_rur) /1) pot,
Extract( MONTH FROM dat_refer ) AS mês,
extract( YEAR FROM dat_refer ) AS ano
FROM tpotencia p
WHERE p.dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND p.dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
and p.cod_conj_aneel_2001= COD_ANEEL
GROUP BY Extract( MONTH FROM dat_refer ), extract( YEAR FROM dat_refer )
) cc,
( SELECT DISTINCT t.cod_tipo_trecho, trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t
WHERE t.num_id_interrupcao IN
( SELECT t.num_id_interrupcao
FROM titensinter i, tinter_intertrecho t,tpotencia p
WHERE t.num_id_interrupcao = i.num_id_interrupcao
AND i.num_id_hierarquia=p.num_id_hierarquia
AND p.cod_conj_aneel_2001= COD_ANEEL
AND t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
GROUP BY t.cod_tipo_trecho, trunc( t.Dat_inicio )
) aux,
( SELECT Sum((i.qtd_cons_ating + i.qtd_cons_prim_atingi + i.qtd_cons_rur_ating) * NVL (t.num_religam_calculado,1)) valfec,
(Sum((i.qtd_cons_ating + i.qtd_cons_prim_atingi + i.qtd_cons_rur_ating) * i.min_duracao) / 60) valdec,t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t,titensinter i
WHERE t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.num_id_interrupcao =i.num_id_interrupcao
AND i.num_id_hierarquia IN
( SELECT DISTINCT num_id_hierarquia
FROM tpotencia
WHERE cod_conj_aneel_2001 = COD_ANEEL
AND dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.tag_prog_acid='A'
AND i.tag_mom_sus = NVL(TIPO_DURACAO,i.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
) fecdecAcid,
( SELECT SUM ((i.qtd_cons_ating +i.qtd_cons_prim_atingi +i.qtd_cons_rur_ating) *
NVL (t.num_religam_calculado,1)) valfec,
(SUM ((i.qtd_cons_ating + i.qtd_cons_prim_atingi + i.qtd_cons_rur_ating) * i.min_duracao) / 60) valdec, t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t, titensinter i
WHERE t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.num_id_interrupcao =i.num_id_interrupcao
AND i.num_id_hierarquia IN
( SELECT DISTINCT num_id_hierarquia
FROM tpotencia
WHERE cod_conj_aneel_2001 = COD_ANEEL
AND dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.tag_prog_acid='P'
AND i.tag_mom_sus = NVL(TIPO_DURACAO,i.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
) fecdecProg,
( SELECT (SUM ((a.qtd_cons_ating + a.qtd_cons_prim_ating + a.qtd_cons_rur_ating) * a.min_duracao ) / 60) valtrans, t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t,
ttransferenciaconint a,
titensinter i
WHERE t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.num_id_interrupcao =i.num_id_interrupcao
AND i.num_id_interrupcao =a.num_id_interrupcao
AND i.num_id_item =a.num_id_item
AND i.num_id_hierarquia IN
( SELECT DISTINCT num_id_hierarquia
FROM tpotencia
WHERE cod_conj_aneel_2001 = COD_ANEEL
AND dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.tag_prog_acid='P'
AND t.tag_mom_sus = NVL(TIPO_DURACAO,t.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
) transfProg,
( SELECT (SUM ((a.qtd_cons_ating + a.qtd_cons_prim_ating + a.qtd_cons_rur_ating) * a.min_duracao ) / 60) valtrans, t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t,
ttransferenciaconint a,
titensinter i
WHERE t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND t.num_id_interrupcao = i.num_id_interrupcao
AND i.num_id_interrupcao = a.num_id_interrupcao
AND i.num_id_item = a.num_id_item
AND i.num_id_hierarquia IN
( SELECT DISTINCT num_id_hierarquia
FROM tpotencia
WHERE cod_conj_aneel_2001 = COD_ANEEL
AND dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.tag_prog_acid='A'
AND i.tag_mom_sus = NVL(TIPO_DURACAO,i.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
)transfAcid ,
( SELECT Count((t.num_id_interrupcao) - NVL(t.num_religam_calculado,0)) AS fAcid,
t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t
WHERE t.num_id_interrupcao IN
( SELECT DISTINCT i.num_id_interrupcao
FROM titensinter i
WHERE i.num_id_hierarquia IN
( SELECT DISTINCT p.num_id_hierarquia
FROM tpotencia p
WHERE p.cod_conj_aneel_2001 = COD_ANEEL
AND p.dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND p.dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
)
AND t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.tag_prog_acid = 'A'
AND t.tag_mom_sus = NVL(TIPO_DURACAO,t.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
) freqAcid,
( SELECT Count((t.num_id_interrupcao) - NVL(t.num_religam_calculado,0)) AS fProg,
t.cod_tipo_trecho,
Trunc( t.Dat_inicio ) AS Dat_inicio
FROM tinter_intertrecho t
WHERE t.num_id_interrupcao IN
( SELECT DISTINCT i.num_id_interrupcao
FROM titensinter i
WHERE i.num_id_hierarquia IN
( SELECT DISTINCT p.num_id_hierarquia
FROM tpotencia p
WHERE p.cod_conj_aneel_2001 = COD_ANEEL
AND p.dat_refer >= TRUNC(To_Date(mês_ANO,'MM/YYYY'))
AND p.dat_refer < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
)
)
AND t.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND t.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND (NOT(t.num_idt_grupo_causas = 4 AND t.num_idt_causa_interrupcao = 7))
AND (NOT(t.num_idt_grupo_causas = 10))
AND t.tag_prog_acid = 'P'
AND t.tag_mom_sus = NVL(TIPO_DURACAO,t.tag_mom_sus)
GROUP BY t.cod_tipo_trecho, Trunc( t.Dat_inicio )
) freqProg
WHERE aux.cod_tipo_trecho = tr.cod_tipo_trecho
AND aux.cod_tipo_trecho = fecdecProg.cod_tipo_trecho (+)
AND aux.cod_tipo_trecho = fecdecAcid.cod_tipo_trecho (+)
AND aux.cod_tipo_trecho = transfProg.cod_tipo_trecho (+)
AND aux.cod_tipo_trecho = transfAcid.cod_tipo_trecho (+)
AND aux.cod_tipo_trecho = freqProg.cod_tipo_trecho (+)
AND aux.cod_tipo_trecho = freqAcid.cod_tipo_trecho (+)
AND aux.dat_inicio = fecdecProg.dat_inicio (+)
AND aux.dat_inicio = fecdecAcid.dat_inicio (+)
AND aux.dat_inicio = transfProg.dat_inicio (+)
AND aux.dat_inicio = transfAcid.dat_inicio (+)
AND aux.dat_inicio = freqProg.dat_inicio (+)
AND aux.dat_inicio = freqAcid.dat_inicio (+)
AND aux.dat_inicio >= TRUNC(TO_DATE(mês_ANO,'MM/YYYY'))
AND aux.dat_inicio < TRUNC(LAST_DAY(TO_DATE(mês_ANO,'MM/YYYY')),'DD')+1
AND Extract( YEAR FROM To_Date(aux.Dat_inicio) ) = cc.ano
AND Extract( MONTH FROM To_Date(aux.Dat_inicio) ) = cc.mês
GROUP BY To_Char(aux.dat_inicio,'DD/MM/YYYY')
ORDER BY To_Char(aux.dat_inicio,'DD/MM/YYYY');
Você acha que, dado esta estrutura, há alguma forma de melhorar a performance usando cursores ou algum outro recurso para as subqueries??
Obrigado mais uma vez.