Hierarchische Anfragen

Werbung
SQL Intensivpraktikum SS 2008
Hierarchische Abfragen
JONES
ENAME
---------KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
SCOTT
ADAMS
MILLER
JOB
MGR
--------- --------PRESIDENT
MANAGER
7839
MANAGER
7839
MANAGER
7839
SALESMAN
7698
SALESMAN
7698
SALESMAN
7698
CLERK
7698
SALESMAN
7698
ANALYST
7566
CLERK
7902
ANALYST
7566
CLERK
7788
CLERK
7782
Hierarchische Abfragen
Baumstruktur
CLARK
EMPNO
--------7839
7698
7782
7566
7654
7499
7844
7900
7521
7902
7369
7788
7876
7934
SQL2 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Copyright © Oracle Corporation, 1998. All rights reserved.
KING
Die hierarchische Abfrage muss
möglich sein
EMPNO = 7839
BLAKE
MGR = 7839
SELECT[LEVEL], column, expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)];
where condition:
MILLER
SCOTT
FORD
ALLEN WARD MARTIN TURNER JAMES
expr comparison_operator expr
ADAMS
SMITH
SQL3 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
SQL4 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Gang durch den Baum
Richtung
Marsch durch den Baum
STARTPUNKT
On oben
nach unten
Spalte1 = PARENT KEY
Spalte2 = CHILD KEY
• Spezifiziere den richtigen Bedingungswert
Von unten
nach oben
Spalte1 = CHILD KEY
Spalte2 = PARENT KEY
START WITH column1 = value
CONNECT BY PRIOR column1 = column2
Marsch von oben nach unten durch die
EMP Tabelle.
Beispiel EMP-Tabelle. Beginne mit dem
Angestellten BLAKE
expr comparison_operator expr
... CONNECT BY PRIOR empno = mgr
SQL5 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
SQL6 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Marsch durch den Baum
SQL>
2
3
4
SELECT empno, ename, job, mgr
FROM
emp
CONNECT BY PRIOR mgr = empno
START WITH empno = 7698;
EMPNO
------7698
7839
ENAME
---------BLAKE
KING
JOB
MGR
--------- --------MANAGER
7839
PRESIDENT
SQL7 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Marsch durch den Baum
SQL>
2
3
4
SELECT ename||' reports to '||PRIOR ename "Walk"
FROM
emp
CONNECT BY PRIOR empno = mgr
START WITH ename = 'KING';
Walk
-----------------------------KING reports to
BLAKE reports to KING
MARTIN reports to BLAKE
ALLEN reports to BLAKE
TURNER reports to BLAKE
JAMES reports to BLAKE
...
14 rows selected.
SQL8 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Formatierung eines Hierarchischen Reports
Beispiel für LEVEL und LPAD
Rang der Tupel mit der
Pseudospalte LEVEL
Level 1
root/parent
KING
JONES
CLARK
Level 2
parent/child
BLAKE
SCOTT
FORD MILLER ALLEN WARD MARTIN TURNER JAMES
ADAMS
SMITH
Level 3
parent/child
/leaf
Level 4
leaf
SQL9 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
LEVEL
---------1
2
3
3
3
3
3
2
3
2
3
4
3
4
EMPNO
---------7839
7698
7654
7499
7844
7900
7521
7782
7934
7566
7902
7369
7788
7876
SQL>
SQL>
2
3
4
5
COLUMN org_chart FORMAT A15
SELECT LPAD(' ', 3 * LEVEL-3)||ename org_chart,
LEVEL, empno, mgr, deptno
FROM
emp
CONNECT BY PRIOR empno = mgr
START WITH mgr is null;
SQL10 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Ausgabe
ORG_CHART
--------------KING
BLAKE
MARTIN
ALLEN
TURNER
JAMES
WARD
CLARK
MILLER
JONES
FORD
SMITH
SCOTT
ADAMS
Erzeuge eine Report, der das Management
der Firma mit unterschiedlichen Level
ausgibt. Beginne mit dem höchsten Level
und rücke jeden folgenden ein.
Zweige Abschneiden
MGR
---------7839
7698
7698
7698
7698
7698
7839
7782
7839
7566
7902
7566
7788
SQL11 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
DEPTNO
---------10
30
30
30
30
30
30
10
10
20
20
20
20
20
Benutze die WHERE Klausel
zum Eliminieren der Knoten
WHERE ename != 'SCOTT'
Benutze die CONNECT BY Klausel
zum Eliminieren der Zweige
CONNECT BY PRIOR
empno = mgr AND
ename != 'SCOTT'
JONES
JONES
SCOTT
FORD
SCOTT
FORD
ADAMS
SMITH
ADAMS
SMITH
SQL12 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
Ergebnis
Daten sortieren
Erzeuge einen hierarchischen Report sortiert
nach der Abteilungsnummer
SQL>
SQL>
2
3
4
5
BREAK ON deptno
SELECT LEVEL, deptno, empno, ename, job, sal
FROM
emp
CONNECT BY PRIOR empno = mgr
START WITH mgr is null
ORDER BY deptno;
SQL13 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
LEVEL
---------1
2
3
2
3
3
4
4
2
3
3
3
3
3
DEPTNO
---------10
20
30
EMPNO ENAME
JOB
---------- -----------------7839
KING
PRESIDENT
7782
CLARK MANAGER
7934
MILLER CLERK
7566
JONES
MANAGER
7788
SCOTT
ANALYST
7902
FORD
ANALYST
7369
SMITH
CLERK
7876
ADAMS
CLERK
7698
BLAKE
MANAGER
7654
MARTIN SALESMAN
7499
ALLEN
SALESMAN
7844
TURNER SALESMAN
7900
JAMES
CLERK
7521
WARD
SALESMAN
SQL14 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved
SAL
---------5000
2450
1300
2975
3000
3000
800
1100
2850
1250
1600
1500
950
1250
Herunterladen