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.
# | JOB | JOB-Beschreibung | JOB_HISTORY |
---|---|---|---|
1 | SA_MAN | Sales Manager | SA_MAN |
2 | SA_REP | Sales Representative | SA_REP |
3 | SH_CLERK | Shipping Clerk | |
4 | ST_CLERK | Stock Clerk | ST_CLERK |
5 | ST_CLERK | ||
6 | ST_MAN | Stock Manager | |
7 | ST_TRAINEE | Stock Trainee |
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;
- SA_MAN
- SA_REP
- SH_CLERK
- ST_CLERK
- ST_MAN
- ST_TRAINEE
- SA_MAN
- SA_REP
- ST_CLERK
- 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;
- SA_MAN
- SA_REP
- SH_CLERK
- ST_CLERK
- ST_MAN
- ST_TRAINEE