«Проблема», с которой вы сталкиваетесь при слиянии, заключается в том, что он будет выполнять одно или другое.Если условие соединения работает, записи обновляются в pcevactor
.Если объединение не сработало, записи вставляются в pcevactor
. Вы, похоже, говорите, что ваша таблица #tmpappoint
в настоящий момент заполнена типом 'L', поэтому условие объединения НЕ сработает, иВСТАВКА всегда будет использоваться.
Если вы хотите, чтобы время от времени использовалось ОБНОВЛЕНИЕ (т. Е. Если ev.evid = ap.evid and
ev.officer = ap.optionalid
сработало) в случае 'L' в #tmpappoint
, то вам нужно будет поставить 'L' в IN какхорошо:
optionaltype in ('L', 'O', 'C', 'U'))
Если #tmpappoint
содержит все виды кодов и вы хотите сделать только L, прямо сейчас, уточните таблицу #tmpappoint у источника:
merge pcevactor ev
using (Select * from #tmpappoint where optionaltype = 'L') ap
on (... and
optionaltype in ('L', 'O', 'C', 'U'))
...
Помните, что таблица или запрос после USING в операторе слияния - это набор данных, который управляет слиянием;в pcevactor
будут искать только те строки в ap (будь то запрос или таблица), и при необходимости будут производиться обновления или вставки.Строки, не упомянутые в ap
, не затрагиваются
В силу вышеизложенного:
Если #tmpappoint
содержит все виды кодов, и вы НЕ хотите делать ничего другогочем O, C, U прямо сейчас, уточните таблицу #tmpappoint у источника (и удалите условие слияния, так как оно больше не нужно):
merge pcevactor ev
using (Select * from #tmpappoint where optionaltype in ('O', 'C', 'U')) ap
on (ev.evid = ap.evid and
ev.officer = ap.optionalid
)
when matched then
Если ваши данные в #tmppappoint
в некотором роде является недостатком, например, когда optiontype типа 'L' означает, что в качестве идентификатора нужно использовать идентификатор_представителя, а не его employee_number, вы можете манипулировать данными с помощью запроса, прежде чем пытаться объединить их:
MERGE ...
USING (
SELECT
...,
--let's change what we put in optionalid depending on the code
CASE
WHEN code = 'L' THEN badges.badge_number
ELSE t.employee_number
END as optionalid,
...
FROM
#tmpappoint t
JOIN
badges ON badges.officer_code = t.officer_code
...
В этом случае, если это L, то мы добавляем, например, номер их значка в качестве идентификатора, в противном случае мы добавляем код employee_ .. Мы предварительно обрабатываем данные, чтобы сработали условия включения слияния