Использование MERGE с той же исходной / целевой таблицей в Sql Server - PullRequest
2 голосов
/ 01 марта 2012

Я хочу сделать Upsert на столе из моей программы на Python. Я нашел команду MERGE, но, похоже, это специфично для объединения двух таблиц. Я хочу ОБНОВИТЬ / ВСТАВИТЬ поле в таблицу из одного запроса.

Я хочу что-то быстрее, чем УДАЛИТЬ, затем ВСТАВИТЬ или ВЫБРАТЬ, затем [ВСТАВИТЬ / ОБНОВИТЬ], и пытаюсь заставить MERGE работать. Однако, когда я запускаю его в SSMS, он обновляет все строки в таблице базы данных.

Запрос:

MERGE INTO [LastPriceUpdate] USING 
(SELECT [EventID] FROM [LastPriceUpdate] where [EventID] = 1501845) AS source
ON (source.[EventID] = 1501845)
WHEN MATCHED THEN UPDATE SET [LastPriceUpdate] = getdate() -- where clause not allowed
WHEN NOT MATCHED BY TARGET THEN INSERT ([EventID], [LastPriceUpdate]) VALUES (1501845, getdate());

Этот запрос обновляет все строки, и я хочу, чтобы он обновлял столбец LastPriceUpdate с помощью getdate (), где EventID = {somenumber}

Возможный ответ: Это может быть исправлением; используйте цель на части ON.

MERGE INTO [LastPriceUpdate] AS target USING 
(SELECT [EventID] FROM [LastPriceUpdate] where [EventID] = 1501845) AS source
ON (target.[EventID] = 1501845)
WHEN MATCHED THEN UPDATE SET [LastPriceUpdate] = getdate() -- where clause not allowed
WHEN NOT MATCHED BY TARGET THEN INSERT ([EventID], [LastPriceUpdate]) VALUES (1501845, getdate());  

1 Ответ

3 голосов
/ 01 марта 2012

Я думаю, вы ищете что-то вроде этого.

MERGE INTO LastPriceUpdate as lpu
USING (
        SELECT getdate() as LastPriceUpdate,
               1501845 as EventID
      ) AS src
ON lpu.EventID = src.EventID
WHEN MATCHED THEN
  UPDATE SET LastPriceUpdate = src.LastPriceUpdate
WHEN NOT MATCHED BY TARGET THEN
  INSERT (EventID, LastPriceUpdate) 
    VALUES (src.EventID, src.LastPriceUpdate);  
...