Treewalking mit SQL (Hierarchische Strukturen) |
|
---|---|
Hierarchische Strukturen sind oft und überall anzutreffen (Organigram, Führungsstrukturen). Relationale Datenbanken wie Oracle können solche Beziehungen nicht in einer hierarchischen Baumstruktur speichern. Die Hierarchie wird unter den Datensätze der Tabelle gebildet, indem zwei Spalten der Tabelle dazu benutzt werden um die beiden verwandten Rows miteinander zu koppeln. In der bekannten EMP Tabelle, bilden die beiden Spalten EMPNO und MGR eine Hierarchie unter den Mitarbeitern. Oracle stellt eigene Operatoren zur Verfügung, um auf einfache Art solche hierarchischen Strukturen zu durchwandern (Treewalking). CONNECT BY PRIOR CONNECT BY koppelt verwandte Datensätze, PRIOR bezeichnet die Parent-Row. Im folgenden Beispiel heisst die Bedingung: Die Mitarbeiternummer (EMPNO) der übergeordneten Row muss gleich sein der Managernummer (MGR) der untergeordneten Row. Die Hierarchie wird solange durchwandert, bis keine Rows mehr gefunden werden. Bei einem Zyklus wird mit einer Fehlermeldung abgebrochen. SELECT LPAD(' ',2*(LEVEL-1)) || empno EMPNO
ENAME JOB
MGR SAL
DEPTNO LEVEL Pseudospalte LEVEL LEVEL gibt die Hierarchiestufe an, auf der sich der Datenzatz befindet. Die höchste Hierarchiestufe hat LEVEL = 1. START WITH Mittels START WITH kann definiert werden, wo die Hierarchie beginnen soll. In obigem Beispiel wird beim "Präsidenten" gestartet, also auf der höchsten Hierarchiestufe. Einschränkungen
Beispiele Auslisten aller Mitarbeiter mit ihren Hierarchiestufen, ausser dem Mitarbeiter "BLAKE" und seinen Mitarbeitern. Die CONNECT BY Bedingung wird dazu mit einer weiteren Einschränkung erweitert. SELECT LPAD(' ',2*(LEVEL-1)) || empno
empno,ename,job,mgr,sal,deptno,LEVEL EMPNO
ENAME JOB
MGR SAL
DEPTNO LEVEL Auslisten aller Mitarbeiter mit ihren Hierarchiestufen, ausser den Mitarbeitern von "BLAKE". Durch die Angabe von PRIOR ename != 'BLAKE' werden all diejenigen ausgeschlossen, die unter "BLAKE" arbeiten, "BLAKE" selbst jedoch nicht. EMPNO
ENAME JOB
MGR SAL
DEPTNO LEVEL Fazit Hierarchische Strukturen können recht einfach in einer Tabelle abgebildet werden. Verwandte Rows werden über zwei Spaltenattribute miteinander "gekoppelt". Oracle stellt eigene SQL Erweiterungen zur Verfügung um solche Hierarchien auszulisten. Probleme Ein Problem bei hierarchischen Beziehungen besteht beim Löschen von Datensätzen. Hier stellt sich die Frage, wie zu verfahren ist, wenn ein "Chef" gelöscht wird. Zurückweisen der Operation, alle Untergebenen einem anderen Mitarbeiter zuordnen, die MGR-Nummer auf NULL setzen, oder allenfalls auch alle Untergebenen löschen. Im nächsten Tip der Woche wird auf diese Problematik näher eingegangen. |