////////////////////////////////////////////////////////////////////
// Beispiel 8:
// für Fortgeschrittene: QUERIES und FOREIGNKEY in rekursiver
// Verweisstruktur.
// Dargestellt werden sollen Paare aus Manager/Employee.
// Manager ist wieder ein EMPLOYEE.
// in der Virtab kommt also EMPLOYEE zweimal vor:
// einmal als employee, und einmal als der manager des employees.
// Es sind also Queries noetig.
// Query A: EMPLOYEE als MANAGER und alle seine Details
// Query B: EMPLOYEE als EMPLOYEE und alle seine Masters/Details
// Query S ("sum") verbindet beide Queries:
VIRTUALTABLE HIERARCHY
// EMPLOYEE 2x deklarieren, Verknuepfungsstruktur
// festlegen
TABLE EMPLOYEE QUERY A,S
ALIAS manags // EMPLOYEE einmal als MANAGS ansprechen
FOREIGNKEY emps.MANAGER_ID // Link vom Untergebenent
NOCHANGE // nur employees den managers zuordnen.
// sollten auch noch die manager eingefuegt werden, muesste
// wieder deren manager eingegeben werden (manag.manag_id!), etc.
TABLE EMPLOYEE QUERY B,S
ALIAS emps// EMPLOYEE einmal als EMPS ansprechen
NOFOREIGNKEYS // EMPS soll das Detail sein, d.h.
// es gibt keine Foreignkey-Verweise auf EMPS
// Employees sollen eingefuegt werden:
// also muessen auch alle tabellen, auf die EMP Foreignkeys hat,
// in der Virtab vorkommen (da beim Insert die Foreignkeys aus
// emp auf gueltige jobs, bzw. departments zeigen muessen).
TABLE JOB QUERY A ALIAS MANAG_JOB NOCHANGE
// Foreignkey nicht noetig, da in Query A nur manag auf
// Job zeigen kann
TABLE JOB QUERY B ALIAS EMP_JOB NOCHANGE
// Foreignkey nicht noetig, da in Query B nur emp auf Job
// zeigen kann
TABLE DEPARTMENT QUERY B ALIAS EMP_DEPT NOCHANGE
// Foreignkey nicht noetig, da in Query B nur emp auf DEPARTMENT
// zeigen kann
TABLE LOCATION QUERY B ALIAS EMP_LOC NOCHANGE
// Column-Definitionen benutzen den ALIAS aus der
// TABLE-Definition
COLUMN boss = manags.last_name
COLUMN boss_job = manag_job.function
COLUMN slave = emps.last_name
COLUMN slave_job = emp_job.function
COLUMN slave_loc = emp_loc.regional_group
// slave_location dient dazu, das department zu identifizieren!
// sonst Fehler "ORA-20003: Virtab HIERARCHY, Table EMP_DEPT:
// Auswahl ist mehrdeutig"
COLUMN slave_dept = emp_dept.name ;
|