SQL Merge со вставкой в ​​другую таблицу - PullRequest
7 голосов
/ 22 февраля 2012

Я хочу создать слияние, которое будет сравнивать две таблицы и вставлять несоответствующие значения в другую третью таблицу или переменную таблицы примерно так:

MERGE Assets AS target
USING (@id, @name)FROM Sales AS source (id, name) ON (target.id = SOURCE.id)
WHEN MATCHED THEN 
    UPDATE SET target.Status = @status, target.DateModified = SYSUTCDATETIME()
WHEN NOT MATCHED THEN 
    INSERT INTO @tableVar (id, name, status, dateModified)  
    VALUES (@id, @name, @status, SYSUTCDATETIME())

Ребята, помогите мне преобразовать ее, используя другиестроит.

Ответы [ 2 ]

10 голосов
/ 22 февраля 2012

Вы просто не можете сделать это. MERGE работает только с двумя таблицами - исходной и целевой.

Для вашего требования вам нужно, например, используйте CTE (Common Table Expression), чтобы найти строки, которые не совпадают, - и вставьте их в третью таблицу.

Что-то вроде:

;WITH NonMatchedData AS
(
   -- adapt this as needed - just determine which rows match your criteria,
   -- and make sure to return all the columns necessary for the subsequent INSERT
   SELECT (columns)
   FROM dbo.SourceTable
   WHERE ID NOT IN (SELECT DISTINCT ID FROM dbo.TargetTable)
)
INSERT INTO dbo.ThirdTable(Col1, Col2, ....., ColN)
  SELECT Col1, Col2, ....., ColN
  FROM NonMatchedData
8 голосов
/ 25 декабря 2012

Вы МОЖЕТЕ сделать это очень легко ...

Вы можете заключить оператор MERGE в INSERT INTO FROM:
http://technet.microsoft.com/en-us/library/bb510625.aspx#sectionToggle2

-ИЛИ-

Вы можете сделать это непосредственно в операторе слияния:

Быстрый пример:

WHEN NOT MATCHED THEN
    DELETE
OUTPUT Deleted.* INTO dbo.MyTable;

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

...