При повечето обстоятелства SQL актуализациите се извършват чрез директни препратки към определена таблица (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Въпреки това, понякога може да се окаже полезно да промените съдържанието на таблица косвено , чрез използване на подмножество от данни, получени от израза за вторична заявка.
Извършване на UPDATE
с помощта на вторичен SELECT
изразът може да бъде изпълнен по един от двата начина, главно в зависимост от това коя версия на SQL Server използвате. Ще разгледаме накратко и двете опции, за да можете да намерите кое работи най-добре за вас.
Използване на INNER JOINS
За всички инсталации на 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'
В горния пример ние UPDATING
books.primary_author
поле, за да съответства на authors.name
за „Хобитът“ от JOINING
и двете таблици в заявката към техните съответни, съответстващи стойности на authors.id
и books.author_id
.
Използване на MERGE за UPDATE и INSERT едновременно
За SQL Server 2008 и по-нови, Microsoft представи изключително полезния MERGE
операция, която е подобна на горната INNER JOIN
метод, но MERGE
се опитва да извърши и двете 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)
Пълната заявка при използване на MERGE
със сигурност е малко по-сложен от този на основното INNER JOIN
, но след като разберете как функционира операцията, бързо ще разберете колко мощна може наистина да бъде тази способност.
Първите няколко реда са по-скоро разбираеми:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Искаме да MERGE INTO
(UPDATE
/INSERT
) books
таблица с помощта на вторичните authors
таблица и съпоставяме двете въз основа на един и същ books.author_id = authors.id
сравнение.
Където MERGE
командата се различава е в логиката на разклоняване, която следва.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Тук молим SQL да извърши действие само когато записва MATCHED
– когато бъде намерен съществуващ запис. В този случай изпълняваме стандартно UPDATE
точно както направихме преди, задавайки books.primary_author
поле да е равно на authors.name
поле.
И накрая, ако заявката открие съвпадащ сравнителен запис, който не съществува, вместо това изпълняваме INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Тук просто молим SQL да INSERT
нов запис в books
таблица и предаване на стойностите за author_id
и primary_author
полета, грабнати от свързаните authors
запис на таблицата.
Крайният резултат от нашето MERGE
твърдението е, че за всеки автор в authors
таблица, ние проверяваме дали съответна книга съществува в books
. Ако бъде намерен запис, гарантираме books.primary_author
се задава с помощта на UPDATE
, а когато не е намерено съвпадение, добавяме нов запис към books
.
С това трябва да имате солидно разбиране за два различни метода, които могат да се използват за UPDATE
записва в SQL чрез използване на вторичен, сравнителен SELECT
изявления.