2017-02-07 4 views
0

У меня есть следующий запрос, где я беру данные из таблиц и использую результат для вставки в таблицу finalTable. finalTable.col1 - это pk. Тем не менее, есть несколько строк в finalTable, которые уже существуют с тем же pk до запуска нижеприведенного запроса. Я хочу изменить его так, чтобы он вставлял (если pk не существует в finalTable) или обновления (если pk уже существует в finalTable).TSQL: INSERT или UPDATE из результата SELECT

INSERT INTO finalTable (col1, col2, col3, col4, col5) 
(
SELECT o.id, 14, 0, 1, 4 
FROM Table1 c 
INNER JOIN Table2 m ON c.ID = m.ID 
INNER JOIN Table3 o ON m.ID = o.ID 
WHERE c.ID = 40 
) 

Одно решение, которое я придумал удаляет любые соответствующие строки в finalTable до запуска выше запрос.

Другим решением, которое я придумал, является использование «если существует». Я бы поставил запрос select в оператор if exists, предложение if и предложение else. Мне не нравится это решение, так как я должен поместить выбранный запрос в 3 места, а не только в 1 место.

if exists(...) 
begin 
    ... -- update 
end 
else 
begin 
    ... -- insert 
end 

ответ

3

Вы можете использовать инструкцию MERGE для таких случаев.

MERGE finaltable as target 
USING (SELECT o.id 
     FROM Table1 c 
     INNER JOIN Table2 m ON c.ID = m.ID 
     INNER JOIN Table3 o ON m.ID = o.ID 
     WHERE c.ID = 40) as source 
ON target.col1=source.id 
WHEN MATCHED THEN 
UPDATE SET col2=14,col3=0,col4=1,col5=4 
WHEN NOT MATCHED THEN 
INSERT (col1, col2, col3, col4, col5) 
VALUES (source.id,14, 0, 1, 4) 
+0

MERGE работает отлично. Очень полезно. Благодаря! – user2769810

Смежные вопросы