Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да АКТУАЛИЗИРАТЕ от SELECT в SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използването на SqlParameter в клаузата LIKE на SQL не работи

  2. Как да добавя свойството на идентичност към съществуваща колона в SQL Server

  3. Как да ИЗБЕРЕТЕ *, но без имената на колони трябва да са уникални във всеки изглед

  4. Целият процес за възстановяване на база данни на SQL Server от командния ред

  5. 3 начина за връщане на всички таблици БЕЗ първичен ключ в SQL Server