Kürzlich musste ich zwei Datenlisten (Collections) miteinander vergleichen, wofür mal wieder der MULTISET Operator zum Einsatz kam.

Daten für das Beispiel

Im HR Schema nehmen wir die Tabellen „JOB“ und „JOB_HISTORY“ jeweils reduziert auf die Kürzel, die mit einem „S“ beginnen. JOB-Beschreibung dient nur zur Info, was sich hinter den Kürzeln verbirgt.

#JOBJOB-BeschreibungJOB_HISTORY
1SA_MANSales ManagerSA_MAN
2SA_REPSales RepresentativeSA_REP
3SH_CLERKShipping Clerk
4ST_CLERKStock ClerkST_CLERK
5ST_CLERK
6ST_MANStock Manager
7ST_TRAINEEStock Trainee
ORACLE Schema – HR

Beispiel – Code

DECLARE
    TYPE t_job IS TABLE OF VARCHAR2(2000);
    v_job       t_job;
    v_job_his   t_job;
    
BEGIN
-- Holen wir uns die Jobs der aktuellen Mitarbeiter
    select job_id
      bulk collect into v_job
      from jobs
     where job_id like 'S%';
      
-- und die Jobs mit Historie      
    select job_id
      bulk collect into v_job_his
      from job_history
     where job_id like 'S%';
      
-- Zusammenführung der Daten mit UNION      
  v_job := v_job MULTISET UNION v_job_his;
  
  for i in v_job.first .. v_job.last 
  loop
    dbms_output.put_line (v_job(i));
  end loop;      

END;
  1. SA_MAN
  2. SA_REP
  3. SH_CLERK
  4. ST_CLERK
  5. ST_MAN
  6. ST_TRAINEE
  7. SA_MAN
  8. SA_REP
  9. ST_CLERK
  10. ST_CLERK

    Leider sind doppelte Werte vorhanden
    Default arbeitet ORACLE mit
    UNION ALL und liefert Ergebnisse aus beiden Variablen.

    UNION ALL DISTINCT vermeidet Duplikate.

-- Zusammenführung der Daten mit UNION      
  v_job := v_job MULTISET UNION DISTINCT v_job_his;
  1. SA_MAN
  2. SA_REP
  3. SH_CLERK
  4. ST_CLERK
  5. ST_MAN
  6. ST_TRAINEE