programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Hirarkiska satser i Oracle

1. Hirarkiska satser
2. Exempel

1. Hirarkiska satser

Ibland kan en tabell innehålla hirarkiskt ordnat data. Med hirarki menas i detta fall en trädstruktur eller någon form av länkad lista. Syntaxen
SELECT ..., LEVEL, ...
FROM ...
START WITH parent='Startvärde'
CONNECT BY parent = PRIOR child

2. Exempel

Vi tänker oss att vi har en tabell innehållande data som beskriver mellan vilka personer ett kedjebrev har skickats. Den personen som skickade första kedjebrevet heter Janne och han skickar till Lisa, Stefan, Maja vilka sedan skickar till sina vänner. Vi skapar tabellen:
SQL> CREATE TABLE Letter(
	Sender	VARCHAR(10) NOT NULL,
	Receiver VARCHAR(10) NOT NULL
);	
Tabellen är skapad

SQL> INSERT INTO Letter (Sender, Receiver) VALUES('Janne','Lisa');
INSERT INTO Letter (Sender, Receiver) VALUES('Janne','Stefan');
INSERT INTO Letter (Sender, Receiver) VALUES('Janne','Maja');
INSERT INTO Letter (Sender, Receiver) VALUES('Lisa','Bengt');
INSERT INTO Letter (Sender, Receiver) VALUES('Lisa','Olof');
INSERT INTO Letter (Sender, Receiver) VALUES('Bengt','Britta');
INSERT INTO Letter (Sender, Receiver) VALUES('Britta','Bertil');
Vi tittar på datat:
SQL> SELECT * FROM letter;

SENDER     RECEIVER
---------- ----------
Janne      Lisa
Janne      Stefan
Janne      Maja
Lisa       Bengt
Lisa       Olof
Bengt      Britta
Britta     Bertil

7 rader.
Vi tittar på hela hierarkin, som börjar med Janne:
SQL> SELECT LEVEL, sender, receiver
	FROM letter
	START WITH sender='Janne'
	CONNECT BY sender=PRIOR receiver
	ORDER BY 1;

     LEVEL SENDER     RECEIVER
---------- ---------- ----------
         1 Janne      Lisa
         1 Janne      Stefan
         1 Janne      Maja
         2 Lisa       Bengt
         2 Lisa       Olof
         3 Bengt      Britta
         4 Britta     Bertil

7 rader.
Om vi vill se hirarkin som börjar med Lisa ändrar vi bara i START WITH-delen:
SQL> SELECT LEVEL, sender, receiver
	FROM letter
	START WITH sender='Lisa'
	CONNECT BY sender=PRIOR receiver
	ORDER BY 1;

     LEVEL SENDER     RECEIVER
---------- ---------- ----------
         1 Lisa       Bengt
         1 Lisa       Olof
         2 Bengt      Britta
         3 Britta     Bertil

Om vi utelämnar START WITH får vi alla möjliga kedjor som kan hämtas hur tabellen:
SQL> SELECT LEVEL, sender, receiver
	FROM letter
	CONNECT BY sender=PRIOR receiver
	ORDER BY 1;

     LEVEL SENDER     RECEIVER
---------- ---------- ----------
         1 Bengt      Britta
         1 Britta     Bertil
         1 Janne      Lisa
         1 Lisa       Bengt
         1 Lisa       Olof
         1 Janne      Maja
         1 Janne      Stefan
         2 Britta     Bertil
         2 Lisa       Olof
         2 Lisa       Bengt
         2 Bengt      Britta

     LEVEL SENDER     RECEIVER
---------- ---------- ----------
         3 Bengt      Britta
         3 Britta     Bertil
         4 Britta     Bertil

14 rader.