W większości przypadków aktualizacje SQL są wykonywane przy użyciu odniesień bezpośrednich do określonej tabeli (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Jednak czasami może okazać się korzystna zmiana zawartości tabeli pośrednio , używając podzbioru danych uzyskanych z dodatkowego zapytania.
Wykonywanie UPDATE
za pomocą dodatkowego SELECT
Instrukcja może być wykonana na dwa sposoby, głównie w zależności od używanej wersji SQL Server. Pokrótce omówimy obie opcje, abyś mógł znaleźć to, co jest dla Ciebie najlepsze.
Korzystanie z INNER JOINS
W przypadku wszystkich instalacji SQL Server najbardziej podstawową metodą wykonania tej akcji jest użycie INNER JOIN
, dzięki czemu wartości w kolumnach dwóch różnych tabel są porównywane ze sobą.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
W powyższym przykładzie UPDATING
books.primary_author
pole pasujące do authors.name
za „Hobbit” autorstwa JOINING
obie tabele w zapytaniu do odpowiednich, pasujących wartości authors.id
i books.author_id
.
Korzystanie z funkcji MERGE do jednoczesnej aktualizacji i wstawiania
W przypadku SQL Server 2008 i nowszych, Microsoft wprowadził wyjątkowo przydatny MERGE
operacja podobna do powyższego INNER JOIN
metoda, ale MERGE
próbuje wykonać zarówno UPDATE
i INSERT
polecenie razem. To skutecznie synchronizuje dwie tabele na podstawie wykonanego zapytania, aktualizując i wstawiając rekordy zgodnie z potrzebami, aby były zgodne.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Pełne zapytanie przy użyciu MERGE
jest z pewnością nieco bardziej złożony niż podstawowy INNER JOIN
, ale kiedy już zrozumiesz, jak działa ta operacja, szybko zrozumiesz, jak potężna może być ta funkcja.
Kilka pierwszych linijek jest raczej oczywistych:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Chcemy MERGE INTO
(UPDATE
/INSERT
) books
tabela przy użyciu pomocniczych authors
tabeli i dopasowujemy je na podstawie tego samego books.author_id = authors.id
porównanie.
Gdzie MERGE
Polecenie różni się w następującej logice rozgałęziania.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Tutaj prosimy SQL o wykonanie akcji tylko wtedy, gdy rekordy MATCHED
– gdy zostanie znaleziony istniejący rekord. W takim przypadku wykonujemy standardową UPDATE
tak jak wcześniej, ustawiając books.primary_author
pole równe authors.name
pole.
Wreszcie, jeśli zapytanie wykryje pasujący rekord porównawczy, który nie istnieje, zamiast tego wykonujemy INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Tutaj po prostu prosimy SQL o INSERT
nowy rekord w books
tabeli i przekazywanie wartości dla author_id
i primary_author
pola, pobrane od powiązanych authors
rekord tabeli.
Wynik końcowy naszego MERGE
stwierdzenie jest takie dla każdego autor w authors
tabeli, weryfikujemy, czy odpowiednia książka istnieje w books
. W przypadku znalezienia rekordu upewniamy się, że books.primary_author
jest ustawiana za pomocą UPDATE
, a jeśli nie zostanie znalezione dopasowanie, dodajemy nowy rekord do books
.
Dzięki temu powinieneś dobrze rozumieć dwie różne metody, których można użyć do UPDATE
rekordy w SQL przy użyciu wtórnego, porównawczego SELECT
oświadczenia.