SQL Oracle - Update

0

Dobry wieczór, mam takie następujące dwie encje:
1.pracownicy(id_prac,imie,nazwisko,kod_wydzialu,placa_podstawowa,placa_dodatkowa,kod_stanowiska)
2.stanowiska(kod_stanowiska,nazwa,placa_min,placa_max).

Mam za zadanie pracownikom, którzy zarabiają więcej, niż maksymalna płaca na ich stanowisko obniżyć płacę podstawową do tej kwoty maksymalnej, a różnicę dodać do płacy dodatkowej.
Nie wiem jak to zrobić, aby w "update ... set" jakoś powiązać dwie tabele.
Proszę o pomoc. Pozdrawiam.

0

W sumie powinieneś pokazać co zrobiłeś sam .. no ale co tam (z bani pisane ale powinno być OK):


UPDATE pracownicy
SET placa_dodatkowa = p.placa_dodatkowa + (p.placa_podstawowa - s.placa_max)
        ,placa_podstawowa = s.placa_max

FROM pracownicy p
INNER JOIN stanowiska s
ON p.kod_stanowiska = s.kod_stanowiska

WHERE p.placa_podstawowa > s.placa_max


0

Niestety, nie jest ok, ja zrobiłem tylko tę pierwszą część bo nie mam pojęcia jak skutecznie połączyć te dwie encje.

0

Moze tak:

UPDATE (SELECT p.placa_podstawowa, p.placa_dodatkowa, s.placa_max 
	FROM pracownicy p 
	INNER JOIN stanowiska s ON p.kod_stanowiska = s.kod_stanowiskcy
	WHERE p.placa_podstawowa > s.placa_max)
SET placa_dodatkowa = p.placa_dodatkowa + (p.placa_podstawowa - s.placa_max), placa_podstawowa = s.placa_max;
0
sigmaalgebra napisał(a):

Niestety, nie jest ok, ja zrobiłem tylko tę pierwszą część bo nie mam pojęcia jak skutecznie połączyć te dwie encje.

A tak dokładniej to co jest nie tak ?
czy kod_stanowiska jest kluczem bo jak tak to musi być OK. Wrzuć na http://sqlfiddle.com/ tablice i jakieś przykładowe dane ... to zobaczymy, co jest nie tak i jak temu zaradzić ewentualnie, choć imho powinny być git.

0

Nie wiem jak tego używać, ale wrzucę schemat tutaj:

stanowiska
kod_stanowiska varchar2(3) primary key,
nazwa varchar2(25),
placa_min number(6,2),
placa_max number(6,2));

pracownicy
id_prac numer(3) primary key,
nazwisko varchar2(35),
imie varchar2(35),
placa_podstawowa number(6,2),
placa_dodatkowa number(6,2),
kod_stanowiska varchar2(3)

i muszę pracownikom, których placa_podstawowa jest większa niż placa_max na ich stanowisku obiżyć tę płacę podstawową do tej max płacy, a różnicę dodać do placa_dodatkowa.
Jeżeli wezmę UPDATE pracownicy SET placa_podstawowa=... i tak dalej to nie wiem w jaki sposób pobrać wartość placa_max z tabeli stanowiska.

0

A ja Ci napisałem dokładnie rozwiązanie ... twierdzisz, że nie działa ... ja twierdzę, że albo robisz coś źle albo masz coś nie tak z danymi.

Wklei przykładowe dane to się okaże co jest nie tak.

0

Pokazuje się taki błąd: SQL Error: ORA-00933: polecenie SQL niepoprawnie zakończone

Tutaj wrzucam link z danymi: https://zapodaj.net/4a0a367383781.png.html

0

Heh ok to Oracle tu jest inaczej :| Niby jest w temacie a ja ciągle pisałem jak do MS SQL Serv. Google podpowiada coś takiego, po przerobieniu (sprawdź bo ja w Oraclu to raczej nie bardzo :P ):


UPDATE pracownicy p
   SET (placa_dodatkowa, placa_podstawowa) = (SELECT (p.placa_dodatkowa + (p.placa_podstawowa - s.placa_max)), s.placa_max
                         FROM stanowiska s
                        WHERE p.kod_stanowiska = s.kod_stanowiska and p.placa_podstawowa > s.placa_max)

Edit: Btw. jeśli mnie wzrok nie myli w Twoich przykładowych danych żaden rekord nie spełnia warunków (tj. żaden pracownik nie ma pensji wyższej niż MAX ... heh samo życie .. a i informtykowi miogli by dać więcej :P

0

Świetnie wszystko działa, jeszcze zapomniałeś na końcu odpowiedniego WHERE, żeby to się wykonało dla pracowników których płaca podstawowa jest większa niż płaca maksymalna, ale najważniejsze że działa. Dziękuję bardzo i życzę miłego wieczoru.

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