Update i podzapytania skorelowane

0

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:

  1. Prosiłbym o pomoc w rozwiązaniu przykładu.
  2. Chciałbym się na 100% dowiedzieć czy nie można użyć w Update pytań skorelowanych czy tylko ja coś źle robię.
  3. Chciałbym się dowiedzieć czy można użyć w Update joina.
0

AD 3.
Tak.

UPDATE p
SET ...
FROM pracownicy p
JOIN pracownicy p2 ON ...

ale to nie da Ci poprawnego wyniku, gdy szef ma więcej niż jednego podwładnego (premia będzie tylko z jednego pracownika).

AD 1 i 2

UPDATE szef
SET PLACA_DOD+=0.1*podwladni.PLACA_DOD
FROM pracownicy szef
JOIN (SELECT SUM(PLACA_DOD) PLACA_DOD, ID_SZEFA FROM pracownicy  aa WHERE ID_SZEFA IS NOT NULL GROUP BY ID_SZEFA) podwladni ON podwladni .ID_SZEFA=szef.ID_PRAC

Dodałem sqlfiddle z tym zadaniem (tylko inne nazwy):
http://sqlfiddle.com/#!6/dacd0/7

0

A nie chodzi Ci przypadkiem o taka konstrukcje (wlasnie podzapytanie skorelowane w MSSQL)

 
update 
  Tabela 
set 
  Wartosc = Wartosc + (0.1 * (select sum(x.Kolumna1) from Tabela x where x.MasterId = Tabela.Id) -- korelacja przez nazwe updateowanego obiektu
where
  Active = 1 -- tutaj jakies dodatkowe warunki

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