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

Jak UPDATE z SELECT na SQL Server

Ve většině případů se aktualizace SQL provádějí pomocí přímých odkazů ke konkrétní tabulce (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1 ). Příležitostně se však může ukázat prospěšné změnit obsah tabulky nepřímo pomocí podmnožiny dat získaných z příkazu sekundárního dotazu.

Probíhá UPDATE pomocí sekundárního SELECT lze provést jedním ze dvou způsobů, především v závislosti na verzi serveru SQL, kterou používáte. Krátce prozkoumáme obě možnosti, abyste mohli najít to, co vám nejlépe vyhovuje.

Použití INNER JOINS

U všech instalací SQL Serveru je nejzákladnějším způsobem provedení této akce použití INNER JOIN , přičemž hodnoty ve sloupcích dvou různých tabulek jsou vzájemně porovnávány.

UPDATE
  books
SET
  books.primary_author = authors.name
FROM
  books
INNER JOIN
  authors
ON
  books.author_id = authors.id
WHERE
  books.title = 'The Hobbit'

Ve výše uvedeném příkladu UPDATING books.primary_author pole tak, aby odpovídalo authors.name pro „Hobita“ JOINING obě tabulky v dotazu na příslušné, odpovídající hodnoty authors.id a books.author_id .

Současné AKTUALIZACE a INSERT pomocí MERGE

Pro SQL Server 2008 a novější představil Microsoft mimořádně užitečné MERGE operace, která je podobná výše uvedenému INNER JOIN metoda, ale MERGE se pokusí provést obě UPDATE a INSERT velet společně. To efektivně synchronizuje dvě tabulky na základě provedeného dotazu, aktualizuje a vkládá záznamy podle potřeby, aby se tyto dvě shodovaly.

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)

Úplný dotaz při použití MERGE je jistě o něco složitější než základní INNER JOIN , ale jakmile pochopíte, jak operace funguje, rychle pochopíte, jak mocná tato schopnost může skutečně být.

Prvních pár řádků je spíše samovysvětlujících:

MERGE INTO
  books
USING
  authors
ON
  books.author_id = authors.id

Chceme MERGE INTO (UPDATE /INSERT ) books pomocí sekundárních authors tabulky a porovnáváme dva na základě stejného books.author_id = authors.id srovnání.

Kde je MERGE příkaz se liší v logice větvení, která následuje.

WHEN MATCHED THEN
  UPDATE SET
    books.primary_author = authors.name

Zde žádáme SQL, aby provedl akci pouze v případě, že záznamy MATCHED – když je nalezen existující záznam. V takovém případě provedeme standardní UPDATE stejně jako jsme to udělali dříve, nastavením books.primary_author pole authors.name pole.

A konečně, pokud dotaz objeví odpovídající srovnávací záznam, který není existují, místo toho provedeme INSERT .

WHEN NOT MATCHED THEN
  INSERT
    (books.author_id, books.primary_author)
  VALUES
    (authors.id, authors.name)

Zde jednoduše žádáme SQL, aby INSERT nový záznam do books a předávání hodnot pro author_id a primary_author pole, získaná od přidružených authors záznam tabulky.

Konečný výsledek našeho MERGE prohlášení je, že pro každý autor v authors tabulky, ověříme, zda v books existuje odpovídající kniha . Pokud je záznam nalezen, zajistíme books.primary_author se nastavuje pomocí UPDATE a tam, kde není nalezena žádná shoda, přidáme nový záznam do books .

Díky tomu byste měli dobře rozumět dvěma různým metodám, které lze použít k UPDATE záznamy v SQL pomocí sekundárního, srovnávacího SELECT prohlášení.


  1. Získání popisovače pro nativní Oracle Connection v Hibernate 4 pro spuštění uloženého proc

  2. Oficiální technický blog Microsoft Access je nyní online!

  3. SQL Server 2016:Uložte výsledky dotazu do souboru CSV

  4. 911/112:Datový model služby tísňového volání