Отфильтруйте значения из источника в запросе на слияние в mssql - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть таблица A с Key1 , datetime , когда я использую запрос слияния для вставки, я получаю повторяющиеся строки в источнике.
Какможем ли мы подать источник внутри запроса по дате и времени имеет максимум

MERGE tableA AS t
USING (VALUES 
        ('datakeyA1', 'datetime value'), 
        ('datakeyB1', 'datetime value'),
        ('datakeyA1', 'max datetime value')
    ) AS s (Key1, datetime)
        ON s.Key1 = t.Key1
WHEN MATCHED THEN 
    UPDATE 
    SET    Val = s.datetime
WHEN NOT MATCHED THEN 
    INSERT (Key1, datetime)
    VALUES (s.Key1, s.datetime);

При выполнении вышеуказанного запроса я получаю:

Оператор MERGE попытался ОБНОВИТЬ или УДАЛИТЬ ту же строкуболее одного раза.

Можно ли запросить только эти строки (' datakeyB1 ', ' datetime value '), (' datakeyA1 ', ' max datetime value ') из всех значений без использования промежуточной таблицы?

Ожидаемые результаты только вставляют / обновляют значения datakeyB1 , datakeyA1 .Если дата одинакова в обоих данных, получится только одна строка.

MERGE tableA AS t
USING (VALUES
        ('datakeyB1', 'datetime value'),
        ('datakeyA1', 'max datetime value')
    ) AS s (Key1, datetime)
        ON s.Key1 = t.Key1
WHEN MATCHED THEN 
    UPDATE 
    SET    Val = s.datetime
WHEN NOT MATCHED THEN 
    INSERT (Key1, datetime)
    VALUES (s.Key1, s.datetime);

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете заключить предложение values в оператор выбора, используя top 1 with ties и order by row_number... - как это:

MERGE tableA AS t
USING (
        SELECT TOP 1 WITH TIES *
        FROM
            (VALUES 
                ('datakeyA1', 'datetime value'), 
                ('datakeyB1', 'datetime value'),
                ('datakeyA1', 'max datetime value')
            ) AS s (Key1, datetime)
        ORDER BY ROW_NUMBER() OVER(PARTITION BY Key1 ORDER BY datetime DESC)
        ) s
        ON s.Key1 = t.Key1
WHEN MATCHED THEN 
    UPDATE 
    SET    Val = s.datetime
WHEN NOT MATCHED THEN 
    INSERT (Key1, datetime)
    VALUES (s.Key1, s.datetime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...