Я пытаюсь использовать оператор MERGE для обновления целевой таблицы из исходной таблицы, но получаю сообщение об ошибке, поскольку SQL пытается ОБНОВИТЬ или УДАЛИТЬ более одной записи. Для фона - у меня есть «исходная» таблица, которая, по сути, представляет собой скользящую таблицу, в которой записываются все экземпляры данных, добавляемых бизнесом, - для нее используется только автоинкрементный «идентификатор записи». Таблица «target» может иметь только один экземпляр первичного ключа, то есть «string». Идея состоит в том, чтобы посмотреть на исходную таблицу - если первичный ключ совпадает, то UPDATE назвал строки новыми данными, если нет - ВСТАВЬТЕ всю информацию из новых строк. Проблема в том, что я продолжаю получать сообщение об ошибке, что я пытаюсь ОБНОВИТЬ или УДАЛИТЬ одну и ту же запись дважды. Я полагаю, что это происходит потому, что в исходной таблице действительно есть ДВУХ (или более) экземпляров строки (первичного ключа). Единственным отличием является поле date_added. Как я могу переписать это, чтобы включить оба? Я очень новичок в этой функции SQL, и я пробовал несколько вещей, но все возвращают ошибки. Все благодарности другому пользователю, который первым предложил мне MERGE - я пытался использовать IF / THEN.
Я попытался использовать дату записи MAX в предложениях ON и MATCH, которые возвращали ошибки из-за синтаксиса
MERGE
SCM_Top_Up_Operational O
USING SCM_Top_Up_Rolling R ON (O.String = R.string)
WHEN MATCHED
THEN UPDATE SET
O.Date_Added = R.Date_Added,
O.Real_Exfact = R.Real_Exfact,
O.Excess_Top_Up = R.Excess_Top_Up
WHEN NOT MATCHED BY TARGET
THEN INSERT ( String, Date_Added, Real_Exfact, Article_ID, Excess_Top_Up, Plant)
VALUES (R.String, R.Date_Added, R.Real_Exfact, R.Article_ID, R.Excess_Top_Up, R.Plant);
Вот некоторые примеры данных. Если я запрашиваю scm_top_up_rolling для строки в ('B418496220', 'B111116220'), я получаю следующие результаты:
RECORD_ID String Date_Added Real_Exfact Article_ID Excess_Top_Up Plant
----------- ---------- ---------- ----------- ---------- --------------------------------------- -----
3108 B418496220 2019-02-25 2019-05-15 B41849 1235 6220
3211 B418496220 2019-03-28 2019-03-28 B41849 1 6220
3212 B111116220 2019-03-28 2019-03-28 B11111 1 6220
Теперь, если я запрашиваю scm_top_up_operational для тех же строк, я получаю:
String Date_Added Real_Exfact Article_ID Excess_Top_Up Plant
---------- ---------- ----------- ---------- --------------------------------------- -----
B418496220 2019-02-25 2019-05-15 B41849 1235 6220
Моя цель состояла бы в том, чтобы scm_top_up_operational ОБНОВЛЯЛСЯ самой последней записью для B418496220, поскольку она уже существует в операционной таблице. Тогда я хотел бы ВСТАВИТЬ новую запись для B111116220, поскольку она не существует в операционной таблице.
Надеюсь, это поможет и спасибо.