Вы, кажется, довольно близки, но условия должны быть помещены в ваш компонент SET.LEFT-JOIN в порядке, только то, что вы обновляете на основе ... Вот ЗАКЛЮЧИТЕЛЬНЫЙ запрос для вас.
update p SET
p.Cur_Revenue = ps.Cur_Revenue,
p.Prev_Revenue = ps.Prev_Revenue
from
Product p
LEFT JOIN Product_Staging ps
on p.Account_No = ps.Account_No
AND p.Product_No = ps.Product_No
where
-- This is for condition #3
( NOT ps.Product_No IS NULL
AND ( p.Cur_Revenue <> ps.Cur_Revenue
OR p.Prev_Revenue <> ps.Prev_Revenue ))
OR -- This is for condition #4
( ps.Product_No IS NULL
AND p.Cur_Revenue IS NULL
AND p.Prev_Revenue IS NULL )
УТОЧНЕНИЕ, чтобы ваша голова не болела.
Естьтолько 2 условия, что ваша таблица Продукта должна быть обновлена в вашем примере ... 1 и 2.
1 - Совпадение в ОБАХ таблицах и выручка отличаются, обновите значения от подготовки.
2- Если в постановке НЕТ совпадающих записей, установите производство на NULL.
update p SET
p.Cur_Revenue = ps.Cur_Revenue,
p.Prev_Revenue = ps.Prev_Revenue
from
Product p
LEFT JOIN Product_Staging ps
on p.Account_No = ps.Account_No
AND p.Product_No = ps.Product_No
Так что давайте подумаем об этом.У вас есть возможность присоединиться к постановке на соответствующий Продукт и Учетную запись.Так что в худшем случае у вас есть совпадение или нет.Если у вас нет совпадения, то все значения в промежуточной таблице равны NULL.Если есть совпадение, вы хотите обновить любое его промежуточное значение.Таким образом, набор непосредственно к этому столбцу.По # 1, если совпадение, обновите (у вас есть значение, хорошо).Для # 2, если НЕТ совпадений, установить на ноль (нет совпадений, значения равны нулю).Поэтому нам даже НЕ НУЖНО условие «случай / когда».
Теперь давайте уточним ваши условия 3 и 4, чтобы НЕ обновлять их там, где это не нужно.Во-первых, # 3, есть соответствие и доходы совпадают ...
3) Когда в обеих таблицах есть совпадение между Account_No и Product_No, а значения выручки одинаковы, таблица Product НЕ должна обновляться,Обратите внимание, что вся часть заключена в скобки.«NOT ps.Product_No IS NULL» означает, что он ДЕЙСТВИТЕЛЬНО нашел соответствие с промежуточной таблицей.Когда это так, мы хотим обновлять только тогда, когда ЛИЦА доходов не совпадают.Таким образом, это И с круглыми скобками либо 1, либо другой доход не совпадает (следовательно, <>).Таким образом, если у нас есть совпадающая запись и ОДНА (или обе) суммы отличаются, мы должны обновить ее.
( NOT ps.Product_No IS NULL
AND ( p.Cur_Revenue <> ps.Cur_Revenue
OR p.Prev_Revenue <> ps.Prev_Revenue ))
4) Когда существует запись в Product для определенного Account_No и Product_No с выручкойЗначения равны NULL, и если в Product_Staging нет записи для комбинации Account_No и Product_No, запись Product НЕ должна быть обновлена.
Здесь первое совпадение - НЕТ совпадения в подготовке, следовательно, "ps.Product_No IS NULL", но также, если в промежуточном сценарии нет совпадения, ОБА поля доходности также должны быть нулевыми, чтобы не требовать обновления.Так что я обнуляю оба этих дохода.Если у одного или обоих значений есть значение, вы хотите изменить их на НУЛЬ в соответствии с вашим условием # 2 для обновления.
OR ( ps.Product_No IS NULL
AND p.Cur_Revenue IS NULL
AND p.Prev_Revenue IS NULL )
Надеюсь, это может помешать вашей голове болеть сейчас:)