Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Complex select

Status
Not open for further replies.

Gius

MIS
Sep 20, 2001
12
IT
Hi I have got these three views and a select on them.
I was wondering if it is possible to use only a select to accomplish the same result.


CREATE OR REPLACE VIEW CDWDBA.VIDDS_AUM
AS
select
a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(d.valore_aum)aum
from mvdds_CLIENTE a, taods_aum d
where a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
and d.tipo_aum_id ='MEN'
group by a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm');

CREATE OR REPLACE VIEW CDWDBA.VIDDS_COMMISSIONE
AS
select
a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(t.commissione_CLIENTE)commissioni
from mvdds_CLIENTE a,taods_commissione t , taods_aum d
where a.contratto_id=t.contratto_id
and a.societa_id=t.societa_id
and a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
AND t.TIPO_PROVVIGIONE_ID IN ('R','S','G')
and t.data_competenza >= ADD_MONTHS (TRUNC(d.data_validita,'mm'),-11)
group by a.cliente_id,a.prodotto_id,a.societa_id , TRUNC(d.data_validita,'mm');

CREATE OR REPLACE VIEW CDWDBA.VIDDS_RACCOLTA_NETTA
AS
select
a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(t.importo) raccolta
from mvdds_CLIENTE a,taods_raccolta_netta t , taods_aum d
where a.contratto_id=t.contratto_id
and a.societa_id=t.societa_id
and a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
and t.data_operazione >= ADD_MONTHS (TRUNC(d.data_validita,'mm'),-11)
group by a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm');

And the select that last for two hours is:

select
a.data_validita data_caricamento,
to_char(a.data_validita,'MON/YYYY') mese,
a.cliente_id,
a.prodotto_id,
a.societa_id,
a.aum,
nvl(b.raccolta,0) raccolta,
nvl(c.commissioni,0) commissioni
from vidds_aum a,
vidds_raccolta_netta b,
vidds_commissione c
where a.data_validita = b.data_validita(+)
and a.cliente_id = b.cliente_id(+)
and a.prodotto_id = b.prodotto_id(+)
and a.societa_id = b.societa_id (+)
and a.data_validita = c.data_validita(+)
and a.cliente_id = c.cliente_id(+)
and a.prodotto_id = c.prodotto_id(+)
and a.societa_id = c.societa_id (+)

Please help me
 
I'd try to create some tables as the views, create a useful index on that tables, and then make your query on those tables instead of the views. Finally, you can drop the tables.
Code:
CREATE TABLE CDWDBA.VIDDS_AUM AS
(
select a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(d.valore_aum)aum
from mvdds_CLIENTE a, taods_aum d
where a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
and d.tipo_aum_id ='MEN'
group by a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm');
);

CREATE INDEX a ....

CREATE TABLE CDWDBA.VIDDS_COMMISSIONE AS
(
select
a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(t.commissione_CLIENTE)commissioni
from mvdds_CLIENTE a,taods_commissione t , taods_aum d
where  a.contratto_id=t.contratto_id
and a.societa_id=t.societa_id
and a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
AND t.TIPO_PROVVIGIONE_ID IN ('R','S','G')
and t.data_competenza >= ADD_MONTHS (TRUNC(d.data_validita,'mm'),-11)
 group by a.cliente_id,a.prodotto_id,a.societa_id , TRUNC(d.data_validita,'mm');
);

CREATE INDEX b ...

CREATE TABLE CDWDBA.VIDDS_RACCOLTA_NETTA AS
(
select
a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm') data_validita,
sum(t.importo) raccolta
from mvdds_CLIENTE a,taods_raccolta_netta t  ,  taods_aum d
where  a.contratto_id=t.contratto_id
and a.societa_id=t.societa_id
and a.contratto_id=d.contratto_id
and a.societa_id=d.societa_id
and t.data_operazione >= ADD_MONTHS (TRUNC(d.data_validita,'mm'),-11)
group by a.cliente_id,a.prodotto_id,a.societa_id, TRUNC(d.data_validita,'mm');
);

CREATE INDEX c ...

select a.data_validita data_caricamento,
to_char(a.data_validita,'MON/YYYY') mese,
a.cliente_id,
a.prodotto_id,
a.societa_id,
a.aum,
nvl(b.raccolta,0) raccolta,
nvl(c.commissioni,0) commissioni
from vidds_aum a,
vidds_raccolta_netta b,
vidds_commissione c
where a.data_validita = b.data_validita(+)
and a.cliente_id = b.cliente_id(+)
and a.prodotto_id = b.prodotto_id(+)
and a.societa_id = b.societa_id (+)
and a.data_validita = c.data_validita(+)
and a.cliente_id = c.cliente_id(+)
and a.prodotto_id = c.prodotto_id(+)
and a.societa_id = c.societa_id (+);

DROP TABLE CDWDBA.VIDDS_AUM;

DROP TABLE CDWDBA.VIDDS_COMMISSIONE;

DROP TABLE CDWDBA.VIDDS_RACCOLTA_NETTA;
 
Thank you,
It is an idea, but I was looking for a way to do it in a simpler way, such as using only a select.

Bye


 
I think the main problem is that you're using functions on your query (trunc function), and Oracle optimizer can't optimize your query. I think that doing it on a single select would be the same. Actually, that's what Oracle does to your final query over the views, it transforms your query into a single big query.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top