. , WITH ( , ). WITH . - ( WITH, ).
. - . , . U ( "" ) , , , , "", . C ( "calendar" ) , . U C "owner" - , , . , .
OWNERDATA , TASKID. (1, 2 3) FIRST ( - , , ), NVL, ASSIGNED_OWNER 'N/A', .
with ownerdata ( TASKID, OWNER1, OWNER2, OWNER3 ) as (
select 12345, 'john', 'bob', 'rick' from dual
),
calendar ( PERSONID, aVAIL_STATE, THE_DATE ) as (
select 'john', 2, to_date('3/2/2018', 'mm/dd/yyyy') from dual union all
select 'bob' , 1, to_date('3/2/2018', 'mm/dd/yyyy') from dual union all
select 'rick', 1, to_date('3/2/2018', 'mm/dd/yyyy') from dual
),
input_date ( dt ) as (
select to_date('3/2/2018', 'mm/dd/yyyy') from dual
)
select nvl( min(j.owner) keep (dense_rank first order by pref), 'N/A') as assigned_owner,
(select dt from input_date) as the_date,
o.taskid, o.owner1, o.owner2, o.owner3
from ownerdata o
left outer join
(
select taskid, owner, pref
from (
select taskid, owner, pref
from ownerdata
unpivot ( owner for pref in (owner1 as 1, owner2 as 2, owner3 as 3) )
) u
inner join
( select personid
from calendar
where avail_state = 1 and the_date = (select dt from input_date)
) c
on u.owner = c.personid
) j
on o.taskid = j.taskid
group by o.taskid, o.owner1, o.owner2, o.owner3
;
ASSIGNED_OWNER THE_DATE TASKID OWNER1 OWNER2 OWNER3
-------------- -------- ---------- ------ ------ ------
bob 3/2/2018 12345 john bob rick