2012-02-07 3 views
0

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

CREATE TABLE a 
    (keycol INT PRIMARY KEY, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    col3 INT NOT NULL); 

INSERT INTO a VALUES (1,0,0,0),(2,0,0,0); 

MERGE INTO a 
USING select 1 from a where col1 = 3 
WHEN NOT MATCHED THEN 
UPDATE SET 
col2 = 2, 
col2 = 2, 
col3 = 2 
where col1 = 3 
WHEN NOT MATCHED THEN 
INSERT (keycol, col1, col2, col3) 
VALUES (4, 0, 0, 0) 

Спасибо,

+0

Должно быть, что первое условие 'КОГДА MATCHED' - когда' НЕ MATCHED' не будет иметь строку для обновления и нужно будет вставить – JNK

+0

пожалуйста, прочитайте вопрос, когда ничего совпадения, которые я хочу вставить и обновить – user570715

+1

Я прочитал его, и ваше предлагаемое решение - нонсенс. Когда нет совпадения, вы хотите обновить ** что **? Нет строки для обновления. Вы хотите обновить каждую другую строку в таблице? – JNK

ответ

3
MERGE INTO a 
    USING (
      VALUES (3,3,2,2), 
       (4,0,0,0) 
     ) AS source (keycol, col1, col2, col3) 
    ON a.keycol = source.keycol 
     AND a.col1 = source.col1 
WHEN MATCHED THEN 
    UPDATE 
     SET col2 = source.col2, 
      col3 = source.col3 
WHEN NOT MATCHED THEN 
    INSERT (keycol, col1, col2, col3) 
     VALUES (keycol, col1, col2, col3); 
+0

Это ИМХО правильный ответ - по крайней мере, это работает для меня для точного этого вопроса :) –

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