Cześć, mam do napisania widok oparty na 5ciu tabelach. Niby proste. Ale generalnie to zaczynam wątpić, że to co chcę osiągnąć da się załatwić w widoku i być może będę musiał pisać procedurę składowaną(na razie sobie próbuję utworzyć mniejszy - prostszy widok).
W każdym razie sytuacja wygląda tak.
Mam tabelę EMPLOYEES, w której jest nazwisko, a także pole OID - wyjaśnienie później.
Mam tabelę CALENDARS, w której jest pole OID(powiązanie m.in. z tabelą EMPLOYEES), StartDate i ShiftID
Mam tabelę SHIFTS, która ma pola START i STOP.
Mam tabelę INDIVIDUAL_CALENDARS, w której są pola: StartDate, Start, Stop i EID(powiązanie z tabelą EMPLOYEES).
Teraz, jak wygląda tabela calendars. Np tak:
CALENDARS
ID | OID | StartDate | ShiftID
----------------------------------------------
1 | 2 | 2009-03-01 | 2
----------------------------------------------
1 | 2 | 2009-03-02 | 2
----------------------------------------------
1 | 2 | 2009-03-03 | 2
----------------------------------------------
Oznacza to, że w dniach 1, 2, 3 marca, WSZYSCY pracownicy pracują w godzinach START i STOP zdefiniowanych w tabeli SHIFTS(powiązanie po shiftID).
Na razie proste.
Tyle, że tabela INDIVIDUAL_CALENDARS jest jakby nadrzędna względem CALENDARS. Tzn., że w niej DANY pracownik może mieć zdefiniowane inne godziny pracy w danym dniu niż to wynika z tabeli CALENDARS, a nawet może pracować np. 4 marca - czego nie ma w tabeli CALENDARS.
I teraz chcę osiągnąć taki widok(na razie męczę się z samym polem StartDate):
(Nazwisko pracownika, StartDate, Start, Stop) - który będzie brał pod uwagę wszystkie te tabele
Próbowałem robić to w taki sposób:
--narazie zależy mi na polu StartDate, bo podejrzewam, że reszta będzie analogicznie
select
e.name as [Name],
(case when ic.startDate is null then cal.startDate else ic.startDate end) as startDate,
sh.Start as Start, sh.Stop as Stop
from employees e
left join individual_calendars ic on ic.eid = e.id
left join calendars cal on cal.oid = e.OID
left join shifts sh on cal.shiftID = sh.ID
Jeśli mam wpis w tabeli INDIVIDUAL_CALENDARS, gdzie StartDate jest np 1 marca, to efektem takiego zapytania jest kilka rekordów ze StartDate = 1 marca.
Jak to ugryźć?
[dopisane
Chyba mi się udało, za pomocą unii i dwóch zagnieżdżonych selectów