При повечето обстоятелства 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 изявления.