在大多數情況下,SQL更新使用一個特定的表(UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
)直接引用來執行的。然而,有時候,通過使用從輔助查詢語句獲得的數據的子集間接地改變表的內容可能是有益的。
使用輔助SELECT語句執行UPDATE可以通過兩種方式之一來完成,主要取決於您使用的是哪個版本的SQL Server。我們將簡要探討兩種選擇,以便您可以找到最適合您的選項。
使用內部聯接
對於所有SQL Server安裝,執行此操作的最基本的方法是使用一個INNER JOIN,由此在兩個不同的表的列值進行相互比較。
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
在上面的例子中,我們正在更新books.primary_author場通過在查詢到其各接合兩個表,匹配authors.id的值,以關於「霍比特」的authors.name匹配,並且books.author_id。
使用合併更新並同時
插入用於SQL Server 2008和更新,微軟推出了非常有用的合併操作類似於上述INNER JOIN方法,而是融爲一體,嘗試同時執行的UPDATE和INSERT一起命令。這可以根據執行的查詢有效地同步兩個表,根據需要更新和插入記錄以供兩者匹配。
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)
使用合併時,肯定是更復雜的則是一個基層黨內有點JOIN,但是一旦你掌握瞭如何操作的功能,你很快就會明白如何強大這種能力可以真正完整的查詢。
前幾行是相當不言自明:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
我們希望通過二次authors表合併成(UPDATE/INSERT)的書表,我們兩個基於匹配相同的books.author_id = authors.id比較。
MERGE命令不同的地方在於後面的分支邏輯。
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
這裏我們要求SQL僅在記錄匹配時執行操作 - 找到現有記錄時。在這種情況下,我們執行一個標準的UPDATE,就像我們之前所做的那樣,將books.primary_author字段設置爲等於authors.name字段。
最後,如果查詢發現一個不存在的匹配比較記錄,我們改爲執行INSERT。
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
這裏我們只是要求SQL插入一個新的記錄到書表,並沿着價值傳遞的AUTHOR_ID和primary_author領域,從相關authors表記錄抓起。
我們MERGE聲明的最終結果是,對於作者表中的每個作者,我們驗證書中是否存在相應的書。如果找到記錄,我們確保books.primary_author使用UPDATE進行設置,如果找不到匹配項,我們會爲圖書添加新記錄。因此,您應該對通過使用輔助比較SELECT語句可用於更新SQL記錄的兩種不同方法有深入的瞭解。
樣本數據和預期的結果將真正幫助他人理解數據。 –