Слить не уважающее ПО в SQL - PullRequest
0 голосов
/ 17 января 2019

У меня есть набор операторов Merge, которые я выполняю в Advantage SQL, но я считаю, что некоторые из них не работают. Я знаю почему, но не уверен, где в моем сценарии это не так Смотрите скрипт ниже. Я полагаю, что в операторе ON часть, где говорится, что в типе (например, «O», «C», «U») не указан тип «неправильно». В таблице #tmpappoint не существует необязательных типов O, C или U, а скорее L, но, похоже, мы не игнорируем это утверждение, и мы собираемся вывести необязательный идентификатор из #tmpappoint независимо от того, что это Необязательный тип L. К сожалению, необязательные значения L не являются кодами офицеров, которые можно найти в другой таблице, поэтому я получаю ошибку. Что я могу сделать в этом утверждении, чтобы не обращать внимания на то, что не является O, C или U, поскольку я не могу понять это?

merge pcevactor ev
using #tmpappoint ap
on (ev.evid = ap.evid and
ev.officer = ap.optionalid and
optionaltype in ('O', 'C', 'U'))
when matched then
update set
roles=trim(replace (roles,'C',''))+'C'
when not matched then
insert
(
evid,
officer, 
readstatus,
flagstatus,
roles)
values
(ap.evid,
ap.optionalid,
'U',
'-',
'C');   

1 Ответ

0 голосов
/ 17 января 2019

«Проблема», с которой вы сталкиваетесь при слиянии, заключается в том, что он будет выполнять одно или другое.Если условие соединения работает, записи обновляются в 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_ .. Мы предварительно обрабатываем данные, чтобы сработали условия включения слияния

...