Samospajanje (SELF JOIN) se koristi kada želimo da uporedimo redove unutar iste tabele. To se radi tako što se ista tabela u upitu pojavi dva puta, ali sa različitim aliasima.

Samospajanje, kao što mu ime govori, spaja tabelu sa samom sobom. Da bi se koristilo samospajanje, tabela mora da sadrži kolonu (nazovimo je X) koja deluje kao primarni ključ i drugu kolonu (nazovimo je Y) koja čuva vrednosti koje se mogu upariti sa vrednostima u koloni X (ovde je Y strani ključ). Vrednosti kolona X i Y ne moraju biti iste za bilo koji dati red, a vrednost u koloni Y može čak biti i null.

Nikada ne pišemo rečima "SELF" JOIN !!!

Samospajanje je bilo koji slučaj spajanja tabela kada se i sa leve i sa desne strane reči JOIN koristi ista tabela. Da bismo ih razlikovali, koristimo alijase da u nastavku znamo koja je leva a koja desna ..... 


Osnovna ideja

Iako postoji samo jedna tabela, u upitu se ponaša kao da su dvije kopije iste tabele.

SELECT ...
FROM tabela t1
JOIN tabela t2 ON uslov;

t1 i t2 su aliasi (privremena imena).


Najčešći primer: zaposleni i njihov šef

Tabela: zaposleni

id ime sef_id
1 Marko NULL
2 Ana 1
3 Ivan 1
4 Petra 2
  • sef_id pokazuje na id drugog zaposlenog

  • To znači da je šef takođe zapisan u istoj tabeli


Primer:

SELECT 
    z.ime AS zaposleni,
    s.ime AS sef
FROM zaposleni z
LEFT JOIN zaposleni s 
    ON z.sef_id = s.id;

Objašnjenje:

  • z → zaposleni

  • s → šef (ista tabela, drugi alias)

  • z.sef_id = s.id povezuje zaposlenog sa njegovim šefom

  • LEFT JOIN omogućava da se prikažu i zaposleni bez šefa

Rezultat:

zaposleni sef
Marko NULL
Ana Marko
Ivan Marko
Petra Ana

Vežbe

Kreirati bazu Firma101 i u njoj tabelu Zaposleni:

CREATE TABLE Zaposleni
  (
     ZaposleniID INT PRIMARY KEY, 
     Ime nVARCHAR(200),
     Prezime nVARCHAR(200),
     Drzava VARCHAR(200),
     NadredjeniID INT,
     CONSTRAINT fk1 FOREIGN KEY (NadredjeniID) REFERENCES Zaposleni(ZaposleniID)
  );

Dijagram:

 - slika dijagrama baze *-

Popunjavanje podacima:

INSERT INTO Zaposleni VALUES
  (1, 'Pera', 'Kojot', 'USA', NULL),
  (2, 'Sima', 'Patak', 'USA', 1),
  (3, 'Ptica', 'Trkačica', 'USA', NULL),
  (4, 'Silvester', 'Mačak', NULL, 1),
  (5, 'Paja', 'Patak', NULL, 1),
  (6, 'Pera', 'Kojot', 'Kina', 2),
  (7, 'Sima', 'Patak', 'Indija', 2),
  (8, 'Ptica', 'Trkačica', 'Čile', 3),
  (9, 'Silvester', 'Mačak', 'Kina', 3),
  (10, 'Paja', 'Patak', 'Kina', 4);

Kako bismo ispisali ime zaposlenog i ime njegovog šefa?

1 ... ako se koristi WHERE (bez JOIN-a):

SELECT Z1.Ime AS 'radnik', Z2.Ime AS 'šef'
  FROM Zaposleni AS Z1, Zaposleni AS Z2
  WHERE Z1.NadredjeniID = Z2.ZaposleniID;

2 ... ako se koristi INNER JOIN:

SELECT Z1.Ime AS 'radnik', Z2.Ime AS 'šef'
  FROM Zaposleni AS Z1 INNER JOIN Zaposleni AS Z2
        ON Z1.NadredjeniID = Z2.ZaposleniID;

Primer uparivanja (dejting): Napisati moguće parove za druženje. Uslov je da su iz iste države i da ne može ista osoba da se druži sama sa sobom

SELECT A.Ime AS 'prvi', B.Ime AS 'drugi', A.Drzava AS 'za državu'
 FROM Zaposleni AS A, Zaposleni AS B 
    WHERE A.Drzava = B.Drzava
          AND
          A.ZaposleniID <> B.ZaposleniID;

.... Malo komplikovaniji primeri (rađeno u petak, 23,01, sa drugom grupom):

Ispisati imena i prezimena šefova i koliko radnika im je podređeno, 

  .... ako se prikazuje samo za šefove koji imaju podređene radnike, ali ne i za one koji ih nemaju:

SELECT s.Ime, s.Prezime, COUNT(r.ZaposleniID)
  FROM Zaposleni AS r INNER JOIN Zaposleni AS s
        ON r.NadredjeniID = s.ZaposleniID
GROUP BY s.Ime, s.Prezime;

.... ako se prikazuje i za šefove koji imaju podređene radnike i za one koji ih nemaju:

SELECT s.Ime, s.Prezime, COUNT(r.ZaposleniID)
  FROM Zaposleni AS r RIGHT JOIN Zaposleni AS s
        ON r.NadredjeniID = s.ZaposleniID
GROUP BY s.Ime, s.Prezime;


Linkovi:

Last modified: Friday, 23 January 2026, 8:24 AM