i have 3 tables:
- a (t_ref integer, l_date date),
- b (t_ref integer, client_ref integer),
- c (t_id integer, client_ref integer)
, parameter (client_ref_ integer).
i need select data table condition:
1) if there rows in table b connected client_ref (if query
select b.t_ref b b b.client_ref = client_ref_
returns data), query this:
select max(l_date) t_ref in (select b.t_ref b b b.client_ref = client_ref_)
2) if query above returns data, query this:
select max(l_date) t_ref in (select c.t_id c c c.client_ref = client_ref_)
now i've written plsql function:
select max(aa.l_date) l_date aa aa.t_ref in (select bb.t_ref b bb bb.client_ref = client_ref_); if l_date null select max(aa.l_date) l_date aa t_ref in (select t_id c c c.client_ref = client_ref_); end if; return l_date;
it works, isn't idea, because call table 2 times. possible avoid second call, , in 1 query?
with prep ( t_ref, idx ) ( select b.t_ref, 1 table_b b b.client_ref = :client_ref union select c.t_ref, 2 table_c c c.client_ref = :client_ref ) select max(a.l_date) keep (dense_rank first order p.idx) -- l_date table_a inner join prep p on a.t_ref = p.t_ref ;
explanation: first scan table_b
rows matching client_ref
; if found, collect them , attach "index" of 1
. scan table_c
, same, index 2
. (if table_c
large, wasted time when :client_ref
found in table_b
; if concern, can addressed little more code). table_a
joined result of putting these 2 sets of rows together. keep dense_rank first...
make sure rows withidx = 1
considered max(l_date)
, if no such rows exist rows idx = 2
considered.
if :client_ref
not found in either of tables b , c, resulting max(l_date)
null
.
i wrote query :clent_ref
bind variable test query; may change variable name client_ref_
Comments
Post a Comment