sql >> Databáze >  >> RDS >> Sqlserver

Jak používat UPDATE z SELECT v SQL Server

V tomto článku se budeme zabývat různými metodami pro použití příkazu UPDATE from SELECT v SQL Server.

Ve světě databází se statická data obvykle neukládají. Místo toho se neustále mění, když aktualizujeme stávající data, archivujeme nebo mažeme nepodstatná data a další. Řekněme například, že máte tabulku, která ukládá údaje o cenách produktů pro váš nákupní portál. Ceny produktů se neustále mění, protože můžete svým zákazníkům nabízet slevy na produkty v různých časech. V tomto případě nemůžete přidat nové řádky do tabulky, protože záznam produktu již existuje, ale musíte aktualizovat aktuální ceny pro stávající produkty.

Zde vstupuje do hry dotaz UPDATE. Dotaz UPDATE upravuje data v existujícím řádku v databázi. Pomocí klauzule WHERE můžete aktualizovat všechny řádky tabulky nebo omezit ovlivněné řádky pro aktualizaci. Aktualizace SQL se obvykle provádějí pro existující tabulku s přímým odkazem. Například v tabulce [zaměstnanců] musí požadavek zvýšit plat všech aktivních zaměstnanců o 10 %. V tomto případě bude přímý referenční SQL dotaz:

Aktualizovat sadu zaměstnanců [plat]=plat + (plat * 10/100)  kde [aktivní]=1

Předpokládejme, že máte další tabulku [Adresa], ve které jsou uložena umístění zaměstnanců, a musíte aktualizovat tabulku [Employee] na základě údajů dostupných v tabulce [Address]. Jak aktualizujete data v tabulce [Zaměstnanec]?

Naštěstí existuje řešení – UPDATE z příkazu SELECT. V následující části se podíváme na různé způsoby provádění aktualizací pomocí příkazu SELECT. Například tabulka [Zaměstnanec] má hodnoty NULL pro sloupce – [PostCode] a [City] na následujícím snímku obrazovky. Tabulka [Address] obsahuje hodnoty pro oba sloupce [PostCode] a [City].

Metoda 1:AKTUALIZACE z SELECT:Metoda připojení

Tato metoda používá spojení SQL k odkazování na sekundární tabulku, která obsahuje hodnoty, které je třeba aktualizovat. Proto se cílová tabulka aktualizuje o data referenčních sloupců pro zadané podmínky.

V tomto případě je docela jednoduché použít příkaz UPDATE z SELECT. Nejprve můžete použít příkaz SELECT k načtení hodnot referenčního sloupce a cílového sloupce.

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

Dále ve svém dotazu provedete drobné změny a ten připraví příkaz UPDATE, jak je uvedeno níže.

  1. Nahraďte vybrané klíčové slovo aktualizací.
  2. Uveďte název tabulky nebo alias, který je třeba aktualizovat.
  3. Mezi odkazujícími a cílovými sloupci použijte nastavené klíčové slovo a symbol rovná se (=).
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Poté spusťte příkaz UPDATE a ověřte, že hodnoty zdrojového a cílového sloupce jsou stejné.

Metoda 2:UPDATE z SELECT:Příkaz MERGE

Příkaz MERGE je užitečný pro manipulaci s daty v cílové tabulce na základě dat zdrojové tabulky pro odpovídající i neshodné řádky. Je to alternativní metoda pro provádění UPDATE z funkce příkazu SELECT.

V níže uvedeném příkladu příkazu MERGE jsou provedeny následující úlohy:

  • Pro aktualizaci dat v tabulce [Zaměstnanec] použijte příkaz MERGE.
  • Při použití klauzule USING pak odkazuje na jinou tabulku.
  • WHEN MATCHED pak určuje sloučení JOIN (vnitřní spojení) mezi zdrojovou a cílovou tabulkou.
  • Potom aktualizuje [PostCode] a [City] z tabulky [Address] do tabulky [Employee] pomocí příkazu THEN UPDATE následovaného mapováním zdrojového a cílového sloupce.
  • Příkaz MERGE vždy končí středníkem(;).
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 poddotazu

Poddotaz definuje interní dotaz, který lze použít v příkazech SELECT, INSERT, UPDATE a DELETE. Je to přímočará metoda aktualizace dat existující tabulky z jiných tabulek.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Výše uvedený dotaz používá příkaz SELECT v klauzuli SET příkazu UPDATE.
  • Pokud dílčí dotaz najde odpovídající řádek, aktualizační dotaz aktualizuje záznamy pro konkrétního zaměstnance.
  • Pokud poddotaz vrátí hodnotu NULL (žádný odpovídající řádek), aktualizuje hodnotu NULL pro příslušný sloupec.
  • Pokud poddotaz vrátí více než jeden odpovídající řádek, příkaz UPDATE vyvolá chybu – „Poddotaz SQL Server vrátil více než 1 hodnotu. To není povoleno, pokud poddotaz používá operátory porovnání (=, !=, <, <=,>,>=).“

Omezení poddotazu

  • Poddotaz s operátorem porovnání může obsahovat pouze jeden název sloupce s výjimkou případů, kdy je použit pro operátor IN nebo EXISTS. Pokud tedy požadujeme aktualizaci více sloupců dat, potřebujeme samostatné příkazy SQL.
  • Nemůžete použít ntexttextobrázek datové typy v poddotazu.
  • Poddotaz nemůže zahrnovat GROUP BY a klauzuli HAVING, pokud poddotaz obsahuje neupravený operátor porovnání. Neupravený operátor porovnání nemůže použít klíčové slovo ANY nebo ALL.

Porovnání výkonu mezi různými příkazy UPDATE z SELECT

V této části provedeme srovnání výkonu mezi různými metodami UPDATE z SELECT. Chcete-li to provést, začneme tím, že spustíme dotazy SQL společně, povolíme skutečný plán provádění (Ctrl + M) v SQL Server Management Studio a oddělíme je pomocí příkazu Go.

V prováděcích plánech získám pro své demo následující údaje:

  • Metoda spojení má cenu dotazu 41 % (vzhledem k celkové dávce)
  • Příkaz MERGE má 34% cenu dotazu (v poměru k celkové dávce)
  • Metoda dílčího dotazu má 24% cenu dotazu (v poměru k celkové dávce)

Metoda JOIN využívá 40% náklady na odlišné řazení a 35% náklady na aktualizaci clusterového indexu.

Sloučené spojení používá vnitřní spojení pro porovnávání datových řádků mezi zdrojovými a cílovými daty. Má také maximální relativní náklady na operátora řazení.

Poddotaz je nejrychlejší metodou aktualizace dat sloupce. Používá aktualizaci clusterového indexu a skenování clusterového indexu, jak je zvýrazněno.

Další podrobnosti najdete v mých předchozích článcích: Plán spuštění serveru SQL – co to je a jak pomáhá při problémech s výkonem? a Jak číst a analyzovat prováděcí plány SQL Server.

Shrnutí

Pro provádění příkazů UPDATE z příkazů SELECT můžete použít jakoukoli metodu uvedenou v tomto článku. Poddotaz funguje efektivně, ale má svá vlastní omezení, jak bylo zdůrazněno dříve. Celkový výkon vaší databáze závisí na datech tabulky, počtu aktualizací, vztazích mezi tabulkami, indexech a statistikách.


  1. Proč každá malá firma potřebuje databázi

  2. Jak změnit název databáze na serveru SQL pomocí T-SQL

  3. OracleParameter a klauzule IN

  4. Získejte datový typ pole v příkazu select v ORACLE