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

Jak korzystać z UPDATE z SELECT w SQL Server

W tym artykule omówimy różne metody używania instrukcji UPDATE from SELECT w SQL Server.

W świecie baz danych zazwyczaj nie są przechowywane dane statyczne. Zamiast tego zmienia się, gdy aktualizujemy istniejące dane, archiwizujemy lub usuwamy nieistotne dane i nie tylko. Załóżmy na przykład, że masz tabelę, w której przechowywane są dane o cenach produktów dla Twojego portalu zakupowego. Ceny produktów stale się zmieniają, ponieważ możesz oferować klientom rabaty na produkty w różnym czasie. W takim przypadku nie możesz dodać nowych wierszy w tabeli, ponieważ rekord produktu już istnieje, ale musisz zaktualizować bieżące ceny istniejących produktów.

W tym miejscu pojawia się zapytanie UPDATE. Kwerenda UPDATE modyfikuje dane w istniejącym wierszu w bazie danych. Możesz zaktualizować wszystkie wiersze tabeli lub ograniczyć liczbę wierszy, których dotyczy aktualizacja, za pomocą klauzuli WHERE. Zwykle aktualizacje SQL są wykonywane dla istniejącej tabeli z bezpośrednim odniesieniem. Na przykład w tabeli [pracownik] wymaganie musi zwiększać pensję wszystkich aktywnych pracowników o 10%. W tym przypadku bezpośrednie zapytanie SQL będzie wyglądało następująco:

Zaktualizuj zestaw pracowników [wynagrodzenie]=wynagrodzenie + (wynagrodzenie * 10 / 100)  gdzie [aktywny]=1

Załóżmy, że masz inną tabelę [Adres], która przechowuje lokalizacje pracowników i musisz zaktualizować tabelę [Employee] na podstawie danych dostępnych w tabeli [Adres]. Jak zaktualizować dane w tabeli [Pracownik]?

Na szczęście istnieje rozwiązanie – instrukcja UPDATE from SELECT. W poniższej sekcji przyjrzymy się różnym sposobom wykonywania aktualizacji za pomocą instrukcji SELECT. Na przykład tabela [Employee] ma wartości NULL dla kolumn — [PostCode] i [City] na poniższym zrzucie ekranu. Tabela [Adres] zawiera wartości dla obu kolumn [Kod pocztowy] i [Miasto].

Metoda 1:AKTUALIZUJ z SELECT:Metoda łączenia

Ta metoda używa sprzężeń SQL do odwoływania się do tabeli dodatkowej zawierającej wartości, które należy zaktualizować. Dlatego tabela docelowa jest aktualizowana danymi z kolumn referencyjnych dla określonych warunków.

W tym przypadku użycie instrukcji UPDATE from SELECT jest całkiem proste. Możesz najpierw użyć instrukcji SELECT, aby pobrać wartości kolumny referencyjnej i kolumny docelowej.

SELECT e.City,A.City, e.PostCode,A.PostCode
FROM Employee e
INNER JOIN
[Address] a
ON e.EmpID = A.EmpID

Następnie dokonasz niewielkich zmian w zapytaniu i przygotuje instrukcję UPDATE, jak pokazano poniżej.

  1. Zastąp wybrane słowo kluczowe aktualizacją.
  2. Określ nazwę tabeli lub nazwę aliasu, którą należy zaktualizować.
  3. Użyj słowa kluczowego set i symbolu równości (=) między kolumnami odniesienia i docelowymi.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Następnie wykonaj instrukcję UPDATE i sprawdź, czy wartości kolumny źródłowej i docelowej są takie same.

Metoda 2:UPDATE z SELECT:Instrukcja MERGE

Instrukcja MERGE jest przydatna do manipulowania danymi w tabeli docelowej na podstawie danych tabeli źródłowej zarówno dla dopasowanych, jak i niedopasowanych wierszy. Jest to alternatywna metoda wykonywania UPDATE z funkcji instrukcji SELECT.

W poniższym przykładowym oświadczeniu MERGE wykonywane są następujące zadania:

  • Użyj instrukcji MERGE do aktualizacji danych w tabeli [Pracownik].
  • Następnie odwołuje się do innej tabeli po zastosowaniu klauzuli USING.
  • GDY DOPASOWANE określa następnie scalanie JOIN (Inner Join) między tabelą źródłową i docelową.
  • Następnie aktualizuje [Kod pocztowy] i [Miasto] z tabeli [Adres] do tabeli [Pracownik] za pomocą instrukcji THEN UPDATE, po której następuje mapowanie kolumny źródłowej i docelowej.
  • Instrukcja MERGE zawsze kończy się średnikiem(;).
MERGE Employee AS e
USING(SELECT * FROM [Address]) AS A
ON A.EmpID=e.EmpID
WHEN MATCHED THEN UPDATE SET
e.PostCode=A.PostCode ,
e.City = A.City;

Metoda 3:UPDATE z SELECT:Metoda podzapytania

Podzapytanie definiuje zapytanie wewnętrzne, którego można użyć w instrukcjach SELECT, INSERT, UPDATE i DELETE. Jest to prosta metoda aktualizacji istniejących danych tabeli z innych tabel.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Powyższe zapytanie używa instrukcji SELECT w klauzuli SET instrukcji UPDATE.
  • Jeśli podzapytanie znajdzie pasujący wiersz, zapytanie aktualizujące aktualizuje rekordy dla określonego pracownika.
  • Jeśli podzapytanie zwraca NULL (brak pasującego wiersza), aktualizuje NULL dla odpowiedniej kolumny.
  • Jeśli podzapytanie zwraca więcej niż jeden pasujący wiersz, instrukcja UPDATE zgłasza błąd — „Podzapytanie SQL Server zwróciło więcej niż 1 wartość. Nie jest to dozwolone, gdy podzapytanie używa operatorów porównania (=, !=, <, <=,>,>=).”

Ograniczenia podzapytań

  • Podzapytanie z operatorem porównania może zawierać tylko jedną nazwę kolumny, chyba że użyto jej dla operatora IN lub EXISTS. Dlatego jeśli potrzebujemy aktualizacji wielu kolumn danych, potrzebujemy oddzielnych instrukcji SQL.
  • Nie możesz używać ntexttekstobraz typy danych w podzapytaniu.
  • Podzapytanie nie może zawierać klauzuli GROUP BY i HAVING, jeśli podzapytanie zawiera niezmodyfikowany operator porównania. Niezmodyfikowany operator porównania nie może używać słowa kluczowego ANY ani ALL.

Porównanie wydajności różnych instrukcji UPDATE z SELECT

W tej sekcji dokonamy porównania wydajności między różnymi metodami UPDATE z SELECT. Aby to zrobić, zaczniemy od wspólnego wykonania zapytań SQL, włączając rzeczywisty plan wykonania (Ctrl + M) w SQL Server Management Studio i oddziel je za pomocą instrukcji Go.

W planach wykonania otrzymuję następujące dane do mojego demo:

  • Join Method ma 41% koszt zapytania (w stosunku do całej partii)
  • Wyrażenie MERGE ma 34% koszt zapytania (w stosunku do całej partii)
  • Metoda podzapytania ma 24% koszt zapytania (w stosunku do całej partii)

Metoda JOIN wykorzystuje 40% kosztu dla odrębnego sortowania i 35% kosztu dla aktualizacji indeksu klastrowego.

Łączenie scalające używa sprzężenia wewnętrznego do dopasowywania wierszy danych między danymi źródłowymi i docelowymi. Ma również maksymalny koszt względny dla operatora sortowania.

Podzapytanie jest najszybszą metodą aktualizowania danych w kolumnach. Używa aktualizacji indeksu klastrowego i skanowania indeksu klastrowego, jak zaznaczono.

Więcej informacji można znaleźć w moich poprzednich artykułach:Plan wykonania programu SQL Server — co to jest i jak pomaga w przypadku problemów z wydajnością? oraz Jak czytać i analizować plany wykonania programu SQL Server.

Podsumowanie

Do wykonywania instrukcji UPDATE from SELECT można użyć dowolnej metody określonej w tym artykule. Podzapytanie działa wydajnie, ale ma swoje własne ograniczenia, jak podkreślono wcześniej. Ogólna wydajność bazy danych zależy od danych w tabeli, liczby aktualizacji, relacji między tabelami, indeksów i statystyk.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klient SQL dla Mac OS X, który współpracuje z MS SQL Server

  2. Klauzula SQL OVER() - kiedy i dlaczego jest przydatna?

  3. Przesunięcie wiersza w SQL Server

  4. Nie można znaleźć kolumny dbo, funkcji zdefiniowanej przez użytkownika lub agregacji dbo.Splitfn lub nazwa jest niejednoznaczna

  5. Wykonaj procedurę składowaną w innej procedurze składowanej na serwerze SQL