[ vbbojan @ 23.12.2007. 18:37 ] @
Imam sledeći problem i zelim da ako je moguce da se resi elegantno sa jednim SQL upitom:
Server je MySQL 4....
(struktura podataka je uproscena zbog preglednosti)
Code:

Tabele:

radnici
---------------------
radnikID
ime
prezime

firme
---------------------
firmaID
naziv

staz
---------------------
radnikID
firmaID
datum_od
datum_do

Elem, svaki radnik ima istoriju radnog staža, na primer:
Code:

radnikID   firmaID   datum_od        datum_do
------------------------------------------------
0001       0001      2000-01-01     2000-12-31
0001       0002      2001-01-01     2001-12-31
0002       0003      1990-01-01     1999-12-31
0002       0004      2000-01-01     0000-00-00
0003       0002      2000-01-01     0000-00-00


Deklarisano je pravilo:
Ako je polje datum_do NULL ili ti '0000-00-00' onda je radnik u radnom odnosu.

Pitanje glasi:
Kako dobiti radnike koji nisu u radnom odnosu?

Hvala unapred i pozdrav.
[ vbbojan @ 23.12.2007. 23:30 ] @
Prilično sam neiskusan sa SQL-om, ali mi je veoma interesantno pa sam
zapeo i došao do sledećeg rešenja sa subquery upitom.
Kad sam postavio problem sve mi je izgledalo prilično zapetljano,
a u stvari je jednostavno.

Odgovorih sam sebi, možda pomogne još ponekome...
Code:

SELECT DISTINCT staz.radnikID
FROM            staz
WHERE           staz.radnikID NOT IN 
               (SELECT DISTINCT staz.radnikID FROM staz WHERE datum_do = '0000-00-00');

Ovo radi, ali nemam pojma koliko je optimalno ...

Naravno, verovatno može i bolje. Ima li ko još kakvih ideja.

Pozdrav svima.
[ vilyu @ 24.12.2007. 13:47 ] @
Zapravo veoma jednostavno. Uslov je da polje datum_do bude vece od 0000-00-00. Ukoliko je polje NULL, ono svejedno mora da se proverava sa IS NULL, tako da se NULL rezultati nece pojaviti u ovakvom upitu.

Upit bi mogao da glasi:
Code:

SELECT * FROM radnici
WHERE radnikID IN (
    SELECT radnikID FROM staz
    WHERE datum_do > '0000-00-00'
)

Ili neka kombinacija sa JOIN.
[ Jbyn4e @ 24.12.2007. 22:44 ] @
hm, meni deluje da moze...

Code:

select r.ime, r.prezime from radnici r, firme f, staz s where r.radnikID = s.radnikID and f.firmaID = s.firmaID and s.datum_do > '0000-00-00'


Probaj pa javi.
[ vbbojan @ 25.12.2007. 15:47 ] @
Hvala svima na pomoci.

A sad malo kritike, nista zlonamerno, sve je u cilju unapredjenja opsteg znanja.
Na greskama se covek dobro nauci.


@vbbojan - sam sebi prvo!

Upit radi na mojoj lokalnoj bazi, ali za rad sa test primerom nije ispravan i trebalo bi da glasi:
Code:

SELECT DISTINCT staz.radnikID
FROM            staz
WHERE           staz.radnikID NOT IN 
               (SELECT DISTINCT staz.radnikID FROM staz WHERE datum_do IS NULL);

WHERE izraz u subquery delu upita nije radio kako treba, kad se polje testira da li
je NULL sve radi kako treba.


@vilyu

Tvoj upit vraca sve radnike koji imaju imaju u polju datum_do upisanu vrednost.
Odnosno konkretno po primeru su to radnici 0001 i 0002, ali radnik 0002 je u radnom
odnosu jer ima i sledeći zapis gde je polje datum_do NULL

Moja greska je sto nisam naglasio, ali se iz primera moze videti da
je radnik 0001 bio na dva mesta u radnom odnosu, ali da sada nije u radnom odnosu
i da je radnik 0002 u radnom odnosu, ali i da je ranije bio u još jednoj firmi u radnom odnosu.

(by the way, uspesno resenje treba da vrati kao rezultat radnika 0001)


@Jbyn4e
Tvoj upit takođe vraća dva radnika: 0001 i 0002, opet je u pitanju previd
da radnik u svojoj karijeri može raditi na više mesta.


Još jednom hvala svima, oba vaša upita se mogu lako prepraviti da vrate
pravi rezultat i dali su mi ideju kako da napravim upit koji koristim u programu
da bude jos bolji.

Pozdrav.