Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

UNION ALL THEN GROUP SQL - is a better way

ligonglMar 15 2012 — edited Mar 15 2012
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  			
This post has been answered by Peter K on Mar 15 2012
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 12 2012
Added on Mar 15 2012
6 comments
1,138 views