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.