[ dzimba @ 17.06.2005. 12:56 ] @
Treba da realizujem upit u kome se trazi da iz prve tabele povadim recorde koji ne zadovoljavaju uslov spajanja sa drugom tabelom tj. konkretno imam tabelu nastavnici u kojoj su sifre nastavnika i imena i tabelu angazovanje u kojoj su predmeti koje ti nastavnici predaju. Tabele su povezane preko sifre nastavnika. Dakle upit bi trebao da zadovolji ovo pitanje : Prikazati sifre nastavnika koji ne predaju ni jedan predmet.

Hvala.
[ solic @ 17.06.2005. 13:07 ] @
Primer:

Tabela nastavnici
ID_Nastavnik
Prezime
Ime ....

Tabela Angazovanje
- ID_Predmet
- ID_Nastavnik
............

SELECT * FROM Nastavnici
WHERE ID_Nastavnik NOT IN (SELECT ID_Nastavnik FROM Angazovanje)
[ dzimba @ 17.06.2005. 13:13 ] @
Hvala.

Tako sam i mislio ali nisam bio siguran da mogu da stavim NOT ispred IN a nemam gde da probam posto mySQL ne podrzva ugnjezdene upite.

A moze li to bez ugnjezdenog upita ?
[ negyxo @ 17.06.2005. 14:00 ] @
Moze ali je malo prljavo

Code:

SELECT 
     DISTINCT * 
FROM 
     Nastavnici
     LEFT JOIN Angazovanje ON Angazovanje.ID_Nastavnik = Nastavnici.ID_Nastavnik
WHERE
     Angazovanje.ID_Nastavnik IS NULL


Trebalo bi da je to to sto trazis.
[ Zidar @ 17.06.2005. 14:05 ] @
Citat:
A moze li to bez ugnjezdenog upita ?


Moze, ovako:

SELECT N.*
FROM Nastavnici AS N
LEFT JOIN Angazovanje AS A ON N.ID_Nastavnik =A.ID_Nastavnik
WHERE A.ID_Nastavnik IS NULL

Za tabele sa mnogo rekorda, iskaz sa NOT IN (Select....) moze da bude jako spor, jer se subquery izvrsava za SVAKI rekord u glavnom kveriju.

SELECT * FROM Nastavnici
WHERE ID_Nastavnik NOT IN (SELECT ID_Nastavnik FROM Angazovanje)

Ako imas 20,000 nastavnika za svih 20,000 izvrsice se deo (SELECT ID_Nastavnik FROM Angazovanje) koji svaki put vraca 20,000 rekorda. Znaci, 20,000 puta 20,000.

Moze i ovako:

SELECT N.*
FROM Nastavnici AS N
WHERE NOT EXISTS (SELECT A.ID_Nastavnik FROM Angazovanje AS A WHERE A.NastavnikID=N.NastavnikID)

Ovde subquery za svakog nastavnika vraca samo onoliko rekorda koliko taj anstavnik ima predmeta, znaci 2-3 po jednom rekordu glavnog kverija. Ako u subquery koristis SELECT TOP 1 A.ID_Nastavnik , bice jos brze, maksimalno jedna rekord u subkveriju.

:-)


[ dzimba @ 17.06.2005. 14:18 ] @
Hvala svima. Dobio sam odgovore koje sam trazio.


[ dzimba @ 17.06.2005. 17:38 ] @
Ako moze jos samo jedno pitanjce plz.

Relacija je :

Prijave(predmet,ocena)

dekle prijave ispita:

predmet_1 ... ocena_1
predmet_2 ... ocena_2
.
.
.

Ocene su od 5 do 10 (5->nije polozio)

Zadatak je
Prikazati nazive predmeta koji su polagani, kao i prolaznost na svakom od njih izrazenu u procentima.

Kapiram da bi trebalo da ide neko spajanje sa samim sobom, ali sa kojim uslovom kako bih u jednom countu dobio broj polozenih a u drugom countu broj nepolozenih ispita ?
[ Zidar @ 17.06.2005. 18:04 ] @
CREATE VIEW vwUkupanBrojOcena
AS
SELECT Predmet, COUNT(*) AS UkupanBrojOcena
FROM Prijave
GROUP BY Predmet


CREATE VIEW vwBrojProlaznihOcena
AS
SELECT Predmet, COUNT(*) AS BrojPozitivnihOcena
FROM Prijave
WHERE Ocena>5
GROUP BY Predmet

i na kraju:

SELECT U.predmet
, U.UkupanBrojOcena
, P.BrojPozitivnihIOcena
, P.BrojPozitivnihIOcena/U.UkupanBrojOcena AS ProcenatProlaznosti
FROM vwUkupanBrojOcena AS U
JOIN vwBrojProlaznihOcena AS P ON U.predmet=P.predmet

Ne zameri ako ima nka sitna greskica, kucam direktno u poruku.

:-)

[ dzimba @ 17.06.2005. 23:18 ] @
hvala