Nisam bio na vezbama i ne znam kako je Mirjana objasnila, ali mogu da objasnim kako ja resavam ove zadatke, pa ako se nekome ne svidja moj nacin, nek trazi dalje :D Ovo je zadatak sa zadnjih vezbi, savetujem da kopiras kod u Data Studio pa da tamo citas i pratis objasnjenje jer ovde izgleda dosta razbacano. Pre svega, rekurzija na VSTUD bazi moze da se primenjuje samo na tabelu USLOVNI_PREDMET tako da ce kod skoro uvek biti slican ovome. Pored toga, rekurzija je sablon koji izgleda ovako: WITH NEKO_IME(NEKE_KOLONE) AS ( INICIJALNI_SELECT UNION ALL ITERATIVNI_SELECT ) GLAVNI_SELECT Kao sto samo ime kaze INICIJALNI_SELECT je upit koji predstavlja pocetak rekurzije, u njemu podesavamo vrednosti od kojih se pocinje. Kolona KORAK nam cesto nije potrebna al je stavljamo da bismo imali informaciju o dubini rekurzije u kojoj je dobijen neki red. U inicijalnom select-u nju stavimo na 0. Posto nam se uvek traze uslovni predmeti nekog konkretnog predmeta(U ovom slucaju svih obaveznih sa I smera), kolona KOREN predstavlja bas taj predmed cije uslovne trazimo rekurzijom, njega cemo jednom podesiti u iterativnom select-u i kasnije ga kroz rekurziju necemo menjati kako bi nakon izvrsavanja rekurzije znali tacno koji obavezan predmet uslovljava koje uslovne. U ovom slucaju, za KOREN cemo postavi OP.ID_PREDMETA, odnosno obavezne predmete I smera. ID_TRENUTNOG predstavlja trenutni predmet do kog smo dosli u rekurziji, u inicijalnom select-u, to ce biti isti predmet kao i KOREN, samo sto ce se kako idemo u rekurzijiu ID_TRENUTNOG menjati, dok KOREN nece. ID_USLOVNOG predstavlja uslovne predmete od trenutnog predmeta do kog smo stigli (ID_TRENUTNOG), njega cemo u inicijalnom select-u postaviti bas na uslovne predmete KOREN-a jer je na samom pocetku KOREN taj trenutni predmet. To je sve sto se tice inicijalnog select-a. Nakon toga treba ispisati ITERATIVNI_SELECT. U ITERATIVNO SELECT-U NE SME DA POSTOJI JOIN, SPAJANJE SE VRSI DEKARTOVIM PROIZVODOM A USLOVNOST SPAJANJA SE STAVLJA U WHERE. Svaki put kada se izvrsi iterativni select, napredujemo dublje u rekurziju. Zbog toga KORAK povecavamo za 1 u svakom prolasku. Kako nam KOREN predstavlja samo informaciju o predmetu za koji trazimo uslovne, njega kroz iterativni select ne menjamo. Sada nam je samo preostalo da u iterativnom select-u napravimo pomeraj, tj da namestimo da ID_TRENUTNOG postane ID_USLOVNOG i da za ID_USLOVNOG nadjemo njegov uslovni i njega namestimo za novi ID_USLOVNOG. To radimo tako sto na mesto gde je ID_TRENUTNOG sada u select-u stavimo ID_USLOVNOG, u WHERE-u nadjemo uslovni predmet tog naseg ID_USLOVNOG i njega prosledimo kao UP.ID_USLOVNOG za sledeci poziv. To je sve sto se tice rekurzije, glavni upit najcesve samo spaja PREDMET sa nasom rekurzijom i vadi NAZIV-e. Nadam se da je sada malo jasnije. --3) Написати рекурзивaн SQL упит који за сваки обавезан предмет на смеру Информатика -- издваја предмете који морају да се положе пре полагања обавезног предмета и носе -- по 6 бодова. Издвојити назив обавезног предмета и назив условног предмета. -- Може се користити податак да је идентификатор смера Информатика 201. WITH REKURZIJA(KORAK, KOREN, ID_TRENUTNOG, ID_USLOVNOG) AS ( SELECT 0, --INICIJALNI OP.ID_PREDMETA, OP.ID_PREDMETA, UP.ID_USLOVNOG FROM OBAVEZAN_PREDMET OP JOIN USLOVNI_PREDMET UP ON OP.ID_PREDMETA = UP.ID_PREDMETA AND OP.ID_SMERA = 201 UNION ALL SELECT KORAK + 1, --ITERATIVNI KOREN, R.ID_USLOVNOG, UP.ID_USLOVNOG FROM REKURZIJA R, USLOVNI_PREDMET UP WHERE R.ID_USLOVNOG = UP.ID_PREDMETA ) SELECT P1.NAZIV, P2.NAZIV --GLAVNI FROM REKURZIJA R JOIN PREDMET P1 ON P1.ID_PREDMETA = R.KOREN JOIN PREDMET P2 ON P2.ID_PREDMETA = R.ID_USLOVNOG WHERE P2.BODOVI = 6