Witam.
W ostatnim czasie uczę sie SQL(MSSQL) z skryptów przygotowanych dla bazy danych Oracl, do tej pory wszystkie niezgodności między tymi SZBD potrafiłem rozwiązać. Jednak ostatnio utknąłem przy pewnym zadaniu, którego nie potrafię rozwiązać.
Otóż mam tabelę z następującymi atrybutami: ID_PRAC, NAZWISKO, IMIE, ETAT, ID_SZEFA, ZATRUDNIONY, PLACA_POD, PLACA_DOD, ID_ZESP
Zadanie polega na znalezieniu pracowników którzy mają podwładnych. Następnie należy podnieść im premię o 10% z sumy premii podwładnych danego szefa. Skrypt proponuje następujące rozwiązanie
UPDATE pracownicy s
SET s.placa_dod = s.placa_dod + 0.1 * (
SELECT SUM(placa_pod)
FROM pracownicy WHERE id_szefa = s.id_prac )
WHERE EXISTS (
SELECT * FROM pracownicy WHERE id_szefa = s.id_prac );
Problem polega na tym, że MSSQL uniemożliwia stosowanie podzapytań skorelowanych w Update. W związku z tym polecenie te nie może zostać wykonane.
Próbowałem problem ten obejść w następujący sposób
Update PRACOWNICY
Set PLACA_DOD = PLACA_DOD + 0.1* --Podzapytanie
Where ID_PRAC IN (Select ID_SZEFA
From PRACOWNICY
Group By ID_SZEFA)
Jak widać udało mi się na razie wybrać pracowników którzy mają podwładnych. Jednak nie potrafię dla nich obliczyć 10% pensji dodatkowej ich podwładnych. Przeszukałem internet i znalazłem przykład z bazy MySQL
Update Competition as C
LEFT join (
select CompetitionId, count(*) as NumberOfTeams
from PicksPoints as p
where UserCompetitionID is not NULL
group by CompetitionID
) as A on C.CompetitionID = A.CompetitionID
set C.NumberOfTeams = IFNULL(A.NumberOfTeams, 0)
Przykład ten podsunął mi pomysł, połączenia przy pomocy join mojego zapytania z zapytaniem zaprezentowanym poniżej
Select ID_ZESP, SUM(PLACA_DOD)
From PRACOWNICY
Group By ID_ZESP
Niestety MsSQL tak samo jak pytań skorelowanych nie pozwalał mi użyć Joina. W związku z moimi rozważaniami mam trzy pytania/prośby:
- Prosiłbym o pomoc w rozwiązaniu przykładu.
- Chciałbym się na 100% dowiedzieć czy nie można użyć w Update pytań skorelowanych czy tylko ja coś źle robię.
- Chciałbym się dowiedzieć czy można użyć w Update joina.