Слить не уважающее ПО в SQL

Да, == плохо для сравнения строк (любые объекты действительно, если вы не знаете, что они канонические). == просто сравнивает ссылки на объекты. .equals() тесты для равенства. Для строк часто они будут такими же, но, как вы обнаружили, это не гарантируется всегда.

0
задан a_horse_with_no_name 17 January 2019 в 10:13
поделиться

1 ответ

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

[111 ]

Помните, что таблица или запрос после ИСПОЛЬЗОВАНИЯ в операторе слияния - это набор данных, который управляет слиянием; только те строки в ap (будь то запрос или таблица) будут найдены в pcevactor, и обновления или вставки будут выполняться по мере необходимости. Строки, не упомянутые в 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' означает, что в качестве идентификатора нужно использовать идентификатор badge_number, а не его 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_ .. Мы предварительно обрабатываем данные, чтобы сработали условия включения слияния

0
ответ дан Caius Jard 17 January 2019 в 10:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: