Нужна помощь в понимании ключевого слова MERGE с Sql Server 2008 - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть базовое понимание синтаксиса MERGE для Sql Sever 2008, но у меня есть вопрос о некотором расширенном использовании концепции.

Представьте, что у меня есть спортивная команда, в которой 30 игроков. Каждый игрок представляет собой запись в таблице. Теперь, в середине сезона, некоторые игроки ушли (травмы, что угодно) с новой кровью, пришедшей на смену им.

Поэтому я хочу обновить таблицу базы данных, чтобы точно отразить это изменение.

Поэтому, когда я использую синтаксис MERGE, если нового игрока не существует, он вставляется:

WHEN NOT MATCHED THEN
    INSERT blah blah blah...
    VALUES (blah blah and more blah)..

а когда подобрано, то ничего не делай. (поэтому мне не нужно иметь никаких WHEN MATCHED THEN предложений).

Но как насчет тех игроков, которые ушли? Есть ли где WHEN NOT MATCHED BY SOURCE THEN <merge_matched>, чтобы играть (бум тиш)?

Если так, может кто-нибудь помочь подсказать, как мне его использовать?

Ответы [ 2 ]

9 голосов
/ 19 апреля 2011

Вы можете использовать слияние таким образом, но тогда я думаю, что ваша исходная таблица для новой команды должна содержать всю новую команду, включая те, которые не были изменены. Вот упрощенный образец.

Сезон начинается с этой командой

PlayerName           Position
-------------------- --------
Brett Favre          QB
Joe Montana          QB
John Elway           QB

В середине сезона тренер понимает, что не оптимально иметь команду с тремя довольно старыми QB. Бретт отказывается уходить, поэтому Джо должен идти. Джон играет в РБ, и в то же время нам нужны молодые люди, чтобы все пошло как надо.

PlayerName           Position
-------------------- --------
Brett Favre          QB
John Elway           RB
Jerry Rice           WR
Karl Mecklenburg     LB

Оператор слияния для объединения NewTeam в Team будет выглядеть следующим образом.

merge Team as T
using NewTeam as S
on S.PlayerName = T.PlayerName
when matched then
  update set Position = S.Position
when not matched by target then
  insert (PlayerName, Position) values (S.PlayerName, S.Position)
when not matched by source then
  delete;  
2 голосов
/ 19 апреля 2011

Да, WHEN NOT MATCHED BY SOURCE THEN <merge_matched> - это раздел, в котором вы можете позаботиться об оставленных игроках.

В соответствии с doc , вы можете использовать ОБНОВЛЕНИЕ (например, установитьActive атрибут 0) или инструкция DELETE.

Из документации можно узнать, что таких разделов может быть два.В этом случае один из них определяется с дополнительным условием и может принимать только инструкцию UPDATE:

WHEN NOT MATCHED BY SOURCE AND <i>condition</i> THEN
    UPDATE SET ...

Другой не должен использовать условие и зарезервирован для инструкции DELETE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...