Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zaktualizować z SELECT w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migawki bazy danych programu SQL Server -1

  2. Jak korzystać z funkcji AlwaysOn programu SQL Server

  3. DATEPART() Przykłady w SQL Server

  4. Jak utworzyć bazę danych online z trybu przywracania w SQL Server?

  5. Microsoft zapowiada SQL Server 2012 R2 i SQL Server 2012 R3!