Hi SQL Gurus,
Just trying my luck to see if there is a better way to write the following SQL. I am not sure if the UNION ALL + GROUP BY is the best way. Is it better to use FULL OUTER JOIN instead?
Thank for your time.
Cheers
Ligon
SELECT
x.task_id,
x.task_name,
max(x.actual_effort) actual_effort,
max(x.date_completed) date_completed,
max(x.status) status
FROM
(
SELECT
t.task_id,
t.task_name,
NULL actual_effort,
NULL date_completed,
NULL status
FROM tt_tbl_tasks t, tt_tbl_emps e, tt_tbl_references r
WHERE /*t.task_status = 'Y'
AND*/ t.task_start_dt <= menu_util.get_date('15/02/2010',menu_util.df)
AND NVL(t.task_end_dt,SYSDATE+9999) >= menu_util.get_date('15/02/2010',menu_util.df)
AND e.emp_id = 'MEARS_MP'
AND t.task_id = e.task_id
AND r.ref_type = 'FREQUENCY'
AND t.task_frequency = r.ref_id
AND is_event_ready
(p_start_dt => t.task_start_dt,
p_end_dt => t.task_end_dt,
p_check_dt => menu_util.get_date('15/02/2010',menu_util.df),
p_freq => to_number(r.ref_name)) = 'Y'
UNION ALL
SELECT
t.task_id,
t.task_name,
ev.actual_effort,
ev.date_completed,
ev.status
FROM tt_tbl_tasks t, tt_tbl_emps e, tt_tbl_events ev
WHERE ev.date_completed = menu_util.get_date('15/02/2010',menu_util.df)
AND t.task_id = ev.task_id
AND e.emp_id = 'MEARS_MP'
AND t.task_id = e.task_id
)x
GROUP BY x.task_id,x.task_name
... and below is the plan
Plan
SELECT STATEMENT ALL_ROWSCost: 11 Bytes: 178 Cardinality: 2
18 HASH GROUP BY Cost: 11 Bytes: 178 Cardinality: 2
17 VIEW TTDB. Cost: 10 Bytes: 178 Cardinality: 2
16 UNION-ALL
8 NESTED LOOPS
6 NESTED LOOPS Cost: 5 Bytes: 88 Cardinality: 1
4 NESTED LOOPS Cost: 4 Bytes: 65 Cardinality: 1
2 TABLE ACCESS BY INDEX ROWID TABLE TTDB.TT_TBL_TASKS Cost: 4 Bytes: 52 Cardinality: 1
1 INDEX RANGE SCAN INDEX TTDB.TT_TBL_TASKS_IDX_START_DT Cost: 2 Cardinality: 5
3 INDEX UNIQUE SCAN INDEX (UNIQUE) TTDB.TT_TBL_EMPS_PK Cost: 0 Bytes: 13 Cardinality: 1
5 INDEX UNIQUE SCAN INDEX (UNIQUE) TTDB.TT_TBL_REFERENCES_PK Cost: 0 Cardinality: 1
7 TABLE ACCESS BY INDEX ROWID TABLE TTDB.TT_TBL_REFERENCES Cost: 1 Bytes: 23 Cardinality: 1
15 NESTED LOOPS Cost: 5 Bytes: 64 Cardinality: 1
13 NESTED LOOPS Cost: 5 Bytes: 102 Cardinality: 2
10 TABLE ACCESS BY INDEX ROWID TABLE TTDB.TT_TBL_EVENTS Cost: 3 Bytes: 36 Cardinality: 2
9 INDEX RANGE SCAN INDEX TTDB.TT_TBL_EVENTS_IDX_DT_COMPLETED Cost: 1 Cardinality: 2
12 TABLE ACCESS BY INDEX ROWID TABLE TTDB.TT_TBL_TASKS Cost: 1 Bytes: 33 Cardinality: 1
11 INDEX UNIQUE SCAN INDEX (UNIQUE) TTDB.TT_TBL_TASKS_PK Cost: 0 Cardinality: 1
14 INDEX UNIQUE SCAN INDEX (UNIQUE) TTDB.TT_TBL_EMPS_PK Cost: 0 Bytes: 13 Cardinality: 1