Pokazywanie postów oznaczonych etykietą USING. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą USING. Pokaż wszystkie posty

wtorek, 13 czerwca 2017

Lekcja 27. Instrukcja MERGE

Instrukcja MERGE umożliwia aktualizację i dołączenie wierszy z jednej tabeli do drugiej. Możemy na przykład złączyć z tabelą customer zmiany wprowadzone w klientach w innej tabeli. Aby dobrze zobrazować działanie instrukcji MERGE należy utworzyć nową tabelę customer_changes. Czynność tą realizuje poniższa instrukcja:


Poniższe zapytanie pobiera z tabeli customer_changes kolumny cust_no, customer i city:


Dla porównania poniższe zapytanie pobiera z tabeli customer kolumny cust_no, customer i city:


Załóżmy, że chcemy scalić wiersze z tabeli customer_changes z tabelą customer zgodnie z poniższymi regułami:
  • W przypadku wierszy z takimi samymi wartościami cust_no w obu tabelach do istniejących wierszy tabeli customer. Na przykład w tabeli customer_changes miasto klienta numer 1009 jest inne niż w tabeli customer, dlatego też miasto tego klienta musi zostać zmienione w tabeli ­customer. Klient numer 1010 ma inną nazwę i cenę, więc w tabeli customer muszą zostać zmienione obydwie wartości.
  • Wiersze występujące tylko w tabeli customer_changes powinny zostać wstawione do tabeli customer. Klienci nr 1017 i 1018 występują tylko w tabeli ­customer_­changes, muszą więc zostać wstawione do tabeli customer.
Instrukcję MERGE najłatwiej zrozumieć analizując przykład (poniższy wykonuje scalanie zgodnie z przedstawioną listą reguł):


W instrukcji MERGE są następujące części:
  • Klauzula INTO określa nazwę tabeli, z którą będą scalane wiersze. W przykładzie jest to tabela customer, której nadano alias c.
  • Klauzula USING … ON określa złączenie tabeli. W przykładzie złączenie jest dokonywane przez kolumny cust_no tabel customer i customer_changes. Tabeli . Tabeli customer_changes nadano alias cc.
  • Klauzula WHEN MATCHED THEN określa czynność wykonywaną, gdy wiersz spełnia klauzulę USING … ON. W przykładzie czynnością jest instrukcja UPDATE, która przypisuje wartościom kolumn customer i city wiersza istniejącego w tabeli customer wartości odpowiedniego wiersza tabeli customer_changes.
  • Klauzula WHEN NOT MATCHED THEN określa czynność wykonywaną, gdy wiersz nie spełnia klauzuli USING … ON. W przykładzie czynnością jest instrukcja INSERT, która wstawia wiersz do tabeli customer, pobierając wartości kolumn z wiersza z tabeli customer_changes.
Po uruchomieniu przedstawionej instrukcji MERGE widzimy, że zostały scalone cztery wiesze. Są to wiesze, w których cust_no ma wartość 1009, 1010, 1017 i 1018.  Poniższe zapytanie pobiera z tabeli customer cztery scalone wiersze:

 


W tych wiersza zostały wprowadzone następujące zmiany:
  • klient numer 1009 ma nowe miasto
  • klient numer 1010 ma nową nazwę oraz miasto
  • klienci numer 1017 i 1018 zostali dodani do tabeli

środa, 7 czerwca 2017

Lekcja 20. Złączenia wewnętrzne.

Złączenia wewnętrzne zwracają wiersz tylko wtedy, gdy kolumny w złączeniu spełniają warunek złączenia. To oznacza, że jeżeli wiersz w jednej kolumn w warunku złączenia posiada wartość NULL, nie zostanie on zwrócony. Prezentowane dotychczas złączenia (Lekcja 9. Instrukcja SELECT wykorzystująca klika tabel.) były przykładami złączeń wewnętrznych.

Wcześniej do wykonania złączenia wewnętrznego stosowaliśmy poniższe zapytanie zgodne ze standardem SQL/86: 

W standardzie SQL/92 do wykonywania złączeń wewnętrznych służą klauzule INNER JOIN i ON. Poniższe zapytanie ma takie samo znaczenie jak zapytanie przedstawione powyżej, użyto w nim jednak klauzul INNER JOIN i ON:


W zapytaniu słowo INNER jest opcjonalne.

Upraszczanie złączeń za pomocą słowa kluczowego USING
Standard SQL/92 pozwala jeszcze bardziej uprościć warunek złączenia przez zastosowanie słowa kluczowego USING. Występują tutaj jednak pewne ograniczenia:

  •              Zapytanie musi wykorzystywać równozłączenie (=)
  •              Kolumny w równozłączeniu muszą mieć taką samą nazwę

Równozłączenia stanowią większość wykonywanych złączeń, a jeżeli będziemy zawsze nazywali klucze obce tak jak odpowiednie klucze główne, warunki te będą spełnione.
W poniższym zapytaniu wykorzystano słowo kluczowe USING zamiast ON:

 

Gdy kolumny występujące w warunku łączącym są tej samej nazwy możemy również użyć słowa kluczowego NATURAL JOIN. Jest to jednak odradzane, ponieważ może się trafić sytuacja gdy będzie więcej dopasowań kolumn o tej samej nazwie niż jedna. Poniższe zapytanie ma takie samo znaczenie jak zapytanie przedstawione powyżej, użyto w nim jednak klauzul NATURAL JOIN:

 

Wykonywanie złączeń wewnętrznych obejmujących więcej niż dwie tabele
Wcześniej opracowaliśmy następujące zapytanie, pobierające wiesze z tabel employee, department, job, country :

Poniższe zapytanie ma takie samo znaczenie, ale wykorzystuje składnię SQL/92. Użyto w nim klauzul INNER JOIN i ON: