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í.