在大多数情况下,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记录的两种不同方法有深入的了解。
样本数据和预期的结果将真正帮助他人理解数据。 –