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.
- Zastąp wybrane słowo kluczowe aktualizacją.
- Określ nazwę tabeli lub nazwę aliasu, którą należy zaktualizować.
- 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ć ntext , tekst i obraz 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.