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