[MSSQL] Nie mogę se poradzić z Selectem

0

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

0

tak taki problem da sie rozwiazac za pomoca unii


SELECT E.name AS [Name], 
            CAL.startDate,
            SH.Start, 
            SH.Stop
FROM employees E
         LEFT JOIN calendars CAL ON CAL.oid = E.OID
         LEFT JOIN shifts SH ON cal.shiftID = sh.ID
UNION ALL
select 
        e.name as [Name], 
        ic.startDate,
        sh.Start as Start, 
        sh.Stop as Stop
from employees e
left join individual_calendars ic on ic.eid = e.id
left join shifts sh on cal.shiftID = sh.ID
WHERE IC.eid NOT IN (SELECT .... FROM calendars)

cos mniej wiecej takiego. Jak wpiszesz samo union to powinien pominac duplikaty i podzapytanie w 2 czesci nie bedzie potrzebne

1 użytkowników online, w tym zalogowanych: 0, gości: 1