Hi,
1st disclaimers:
- I'm not a programmer, never was
- had never been taught "higher" math
- despite the upper statements sometimes I have to work with SQL.
Now I need to create a view
from a select
of my colleagues (who had used four union
s looked like he do not know how to use or
in the where part...), and now I'm here.
Is there a simple readable way of getting rid of the last UNION
while getting the same result set?
Thanks in advance!
select a.prodt_cde,
b.ccy,
a.int_tabno,
b.start_dn,
b.end_dn,
b.frte_term,
b.base_id,
b.ptvar,
c.base_rate,
c.desc_shnm,
c.rel_day
from linc.systwodb_ptico a, linc.systwodb_ptlfo b, linc.systwodb_baso c
where a.prodt_cde in
(select prodt_cde
from linc.systwodb_ptmao
where prodt_clas in (select prod_clas
from linc.systwodb_ramto
where main_type in (71, 72))
and allow_dif in ('Y', 'M'))
and a.int_type = 'LS'
and a.int_tabno = b.int_tabno
and b.ccy in
(select ccy from linc.systwodb_ptmao where prodt_cde = a.prodt_cde)
and b.base_id <> 0
and b.base_id = c.base_id
and b.ccy = c.ccy
and ((b.end_dn = 0 and b.start_dn <= c.rel_day) or
(b.end_dn <> 0 and b.start_dn <= c.rel_day and
b.end_dn >= c.rel_day) or
(b.start_dn > c.rel_day and not exists
(select *
from linc.systwodb_baso
where base_id = b.base_id
and ccy = b.ccy
and rel_day = b.start_dn) and
c.rel_day = (select NVL(max(rel_day), 0)
from linc.systwodb_baso
where base_id = b.base_id
and ccy = b.ccy
and rel_day < b.start_dn)))
-- 4. PTLFO.BASE_ID = 0, or cannot find BASO before PTLFO.START_DN
union
select a.prodt_cde,
b.ccy,
a.int_tabno,
b.start_dn,
b.end_dn,
b.frte_term,
b.base_id,
b.ptvar,
0 as base_rate,
' ' as desc_shnm,
0 as rel_day
from linc.systwodb_ptico a, linc.systwodb_ptlfo b --, linc.systwodb_baso c
where a.prodt_cde in
(select prodt_cde
from linc.systwodb_ptmao
where prodt_clas in (select prod_clas
from linc.systwodb_ramto
where main_type in (71, 72))
and allow_dif in ('Y', 'M'))
and a.int_type = 'LS'
and a.int_tabno = b.int_tabno
and b.ccy in
(select ccy from linc.systwodb_ptmao where prodt_cde = a.prodt_cde)
and (b.base_id = 0 or not exists
(select *
from linc.systwodb_baso
where base_id = b.base_id
and ccy = b.ccy
and rel_day <= b.start_dn))
;