UPDATE, INNER JOIN – Kurs języka SQL (mySQL) cz. 5a

W przypadku polecenia UPDATE nie omówiłem jednego zagadnienia, otóż jakim poleceniem wykonać operacje modyfikacji rekordów w jednej tabeli korzystając z danych drugiej tabeli. Wiadomo już, iż do modyfikacji rekordów służy polecenie UPDATE, zaś do łączenia tabel INNER JOIN.

W tym przypadku jednak nie możemy łączyć UPDATE i INNER JOIN.

Poniżej przedstawię przykład. Mamy dwie tabele. Jedną: zarobki_nowe drugą: zarobki_stare.

zarobki_stare:

id_pracownika

kod_dzialu

pensja_brutto

12008

It-1

1000

22008

Marketing-2

2000

32008

It-1

3000

zarobki_nowe:

id_pracownika

kod_dzialu

pensja_brutto

12008

It-1

22008

Marketing-2

32008

It-1

Teraz na podstawie tabeli zarobki_stare chcemy uzupełnić pole pensja_brutto w tabeli zarobki_nowe jednocześnie podwyższając je o 20%.

Polecenie wyglądać będzie następująco:

UPDATE zarobki_stare, zarobki_nowe SET zarobki_nowe.pensja_brutto=zarobki_stare.pensja_brutto*1.2 WHERE zarobki_stare.id_pracownika=zarobki_nowe.id_pracownika

i w rezultacie otrzymamy tabele:

id_pracownika

kod_dzialu

pensja_brutto

12008

It-1

1200

22008

Marketing-2

2400

32008

It-1

3600

9 comments to UPDATE, INNER JOIN – Kurs języka SQL (mySQL) cz. 5a

  • Pixo

    Oczywiście, że można stosować UPDATE i INNER JOIN, proszę nie wprowadzać w błąd internautów.

  • Krzysztof

    Witam.
    Mam taki problem.
    Chciałbym zmienić w rekordach tlko jakiś znak. Na przykład: “Mankut, Lancut, Banka” zamienić tylko “n” na “ń”. Nie wiem jak tu użyć update. Może zastosować REPLACE???

    Będę wdzieczny z pomoc

  • Dzięki

    To takie proste było… uratował mi Pan tyłek :)

  • update nazwa_tabeli set nazwa_pola=replace(nazwa_pola,'n','ń')

  • Marcin

    Witam
    A ja mam problem tego typu, że chciałbym zmienić we wszystkich rekordach danej kolumny tabeli tylko pierwszy znak. Na przykład: z 10001234 na 00001234. Pole jest varchar. Gdy zrobię:

    update tabela
    set kolumna = kolumna – 10000000

    znikają mi zera i zostaje sam nr 1234, a zależy mi na tym, aby ta kolumna miała postać z zerami przed numerem (zawsze 8 znaków).

  • Można posłużyć się funkcją substring, np:

    update tabela set kolumna=substring(kolumna, 2, length(kolumna));

    W powyższym przykładzie funkcja substring obetnie ciąg od drugiego znaku do końca i przypisze do ‘kolumna’

  • Piotr

    Witam
    Jeśli można spytać: jakim skryptem sql można rozwiązać następujący problem (podmiana danych o różnych wartościach
    MAM TABELĘ EW_OBIEKTY w kolumnie RODZAJ chcę zmienić wartości. Wartości chcę skojarzyć po kolumnie NUMER
    Stworzyłem skrypt:
    update EW_OBIEKTY set RODZAJ=’1′ where NUMER=’AsHHQNql0UmKEL3_sTMwEg’
    update EW_OBIEKTY set RODZAJ=’6′ where NUMER=’u7LXzxd1IkKN1uCxDK0gQQ’

    skrypt ten działa ale tylko gdy jest pierwsza linia gdy jest ich więcej wywala błąd. Myślę, że problemem jest brak łącznika między linią jeden i dwa ale nie wiem jaki ten łącznik ma być.
    Proszę o pomoc i z góry dziękuję

  • Zapytania należy kończyć znakiem średnika (;). Po ostatnim zapytaniu średnik może wystąpić, ale nie musi.

    update EW_OBIEKTY set RODZAJ=’1′ where NUMER=’AsHHQNql0UmKEL3_sTMwEg’;
    update EW_OBIEKTY set RODZAJ=’6′ where NUMER=’u7LXzxd1IkKN1uCxDK0gQQ’;

  • Kastor

    Taka sytuacja:
    pierwsza Tabela “Magazyn” posiada m.in. pola “czesc_id” i “qty” a w nim licznik pobranych z magazynu części
    druga Tabela “Rozchody” ma też pole “czesc_id” i pole “rozchod” a w nim liczbe wydanych czesci (dla jednego dokumentu rozchodowego oczywiscie)

    Jak napisac SELECT’a ktory podsumuje ilosci wydanych czesci na poszczegolnych dokumentach rozchodowych (tabela “Rozchody” i zrobi UPDATE tabeli “Magazyn” dla pola “qty” (wstawi tam te sumy)? Oczywiście tabele łączymy po polu “czesc_id”.

    Czyli w skrócie lecimy po wszystkich dokumentach rozchodowych, sumujemy ilosci dla tej samej części a następnie aktualizujemy magazyn w polu “qty” dla danego “czesc_id”

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>