SQL Oracle - Update

Odpowiedz Nowy wątek
2017-12-16 17:12
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.

Pozostało 580 znaków

2017-12-16 17:49
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

Pozostało 580 znaków

2017-12-16 19:08
0

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

Pozostało 580 znaków

2017-12-16 19:32
Skromny Programista
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;
Niestety też nie ;/ - sigmaalgebra 2017-12-16 19:59

Pozostało 580 znaków

2017-12-16 20:17
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.

Pozostało 580 znaków

2017-12-18 19:31
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.

Pozostało 580 znaków

2017-12-18 19:55
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.

Pozostało 580 znaków

2017-12-18 20:02
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

Pozostało 580 znaków

2017-12-18 20:17
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

edytowany 2x, ostatnio: BlackBad, 2017-12-18 20:21
raczej tutaj nie będzie tego warunku p.placa_podstawowa > s.placa_max bo dla wszystkich wierszy przyporządkujemy mniejszą ilośc wierszy - sigmaalgebra 2017-12-18 20:37

Pozostało 580 znaków

2017-12-18 20:25
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.

taa pierwszy edit poszedł jak tylko wrzuciłem post ... musiałeś wyświetlić stronę jak tylko go wysłałem, że nie było jeszcze poprawki ;) Jeśli OK - zaznacz rozwiązanie i zamknij topic. Przydaje się później innym szukającym. - BlackBad 2017-12-18 21:29
ale o to chodzi, że z poprawką nie działa :) - sigmaalgebra 2017-12-19 06:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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