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.
|