Imamo tabelu Grupa
CREATE TABLE Grupa
(IDGrupa INTEGER PRIMARY KEY IDENTITY,
Naziv VARCHAR(50) NOT NULL,
IDNadredjenaGrupa INTEGER NULL,
CONSTRAINT FK_NadredjenaGrupa FOREIGN KEY (IDNadredjenaGrupa)
REFERENCES Grupa (IDGrupa))
i recimo sledeće podatke:
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa1',NULL);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa2',NULL);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa3',NULL);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa3',1);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa4',2);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa5',3);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa6',1);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa7',2);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa8',3);
tj. u ovom slučaju grupe 3,4,5 imaju nadređenu grupu respektivno 1,2,3 kao i grupe 6,7, i 8.
Pošto ovde imamo hijerarhiju preko polja IDNadredjenaGrupa (top level grupe su one koje imaju IDNadredjenaGrupa NULL). Možemo imati bilo koji broj nivoa grupa.
Primera radi dodaćemo i podgrupe drugom nivou grupa.
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa9',4);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa10',5);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa11',6);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa12',7);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa13',8);
INSERT INTO Grupa(Naziv, IDNadredjenaGrupa) VALUES('Grupa14',9);
Sada naše 'stablo' ima 3 nivoa - Top level, podgrupe, i podgrupe tih podgrupa.
Problem: Napisati funkciju, pogled ili šta već u zavisnosti od dbms-a koji će za bilo koju grupu vratiti IDGrupa za top level grupu.
U našem primeru - Grupa1 za Grupu1 (top level grupa je top level za samu sebe), Grupa1 za Grupu3, Grupu2 za Grupu9 (pošto je nadređena grupi9 grupa4, a njena nadređena je grupa2 koja je top level).
Rešenje bi trebalo da obuhvati bilo koji proizvoljan broj nivoa hijerarhije.
Ovaj primer koda je za MSSQL, ali mislim da je ovako na većini drugih implementacija.
Srećno.
Cis.