Запрос на слияние в SQL Server 2008 - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть сценарий загрузки данных из исходной таблицы в целевую таблицу.Если данные из источника отсутствуют в цели, то мне нужно вставить.Если он уже присутствует в целевой таблице, обновите статус строки до «expire» и вставьте столбец как новую строку.Я использовал запрос Merge, чтобы сделать это.Я могу сделать вставку, если не существует, и я могу сделать обновление также.Но при попытке вставить, когда совпадает, он говорит, что вставка не допускается в предложении «когда совпадает»Пожалуйста, помогите мне .. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 февраля 2011

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

Что-то вроде следующего (составление имен таблиц и т. Д.):

;WITH Source as (
    SELECT Col1,Col2,Col3,t.Dupl
    FROM SourceTable,(select 0 union all select 1) t(Dupl)
)
MERGE INTO Target t
USING Source s ON t.Col1 = s.Col1 and s.Dupl=0 /* Key columns here */
WHEN MATCHED THEN UPDATE SET Expired = 1
WHEN NOT MATCHED AND s.Dupl=1 THEN INSERT (Col1,Col2,Col3) VALUES (s.Col1,s.Col2,s.Col3);

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


Из примера, который вы разместили в качестве комментария, я бы изменил:

MERGE target AS tar USING source AS src ON src.id = tar.id
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 

в:

;WITH SourceDupl AS (
    SELECT id,col1,col2,col3,t.Dupl
    FROM source,(select 0 union all select 1) t(Dupl)
)
MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3);

Я изменил значения в предложении VALUES, поскольку в ветви NOT MATCHED таблица tar не имеет строки для выбора значений.

0 голосов
/ 16 февраля 2011

Проверьте одну из этих многочисленных ссылок:

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

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