Обновить значение таблицы из другой таблицы, используя LEFT OUTER JOIN - PullRequest
0 голосов
/ 05 декабря 2018

Я обновляю свой вопрос, добавляя больше деталей и вещей, которые я попробовал.

У меня есть две таблицы Product_Staging и Product.Содержимое таблицы ниже.

Product_Staging:

Account_No         Product_No        Cur_Revenue             Prev_Revenue
12                 AB                5.0                     3.0
13                 BC                4.0                     4.0
15                 DF                10.0                    7.5
17                 BC                NULL                    NULL
18                 AZ                NULL                    NULL 

Product:

Account_No         Product_No        Cur_Revenue             Prev_Revenue
12                 AB                1.0                     3.0
13                 BC                4.0                     5.0
16                 DF                10.0                    17.5
17                 CG                5.0                     6.0
18                 AZ                NULL                    NULL 

Мне нужно обновить поля Cur_Revenue и Prev_Revenue таблицы Product на основеследующие условия.

1) При наличии совпадения между Account_No и Product_No в обеих таблицах и значениями дохода отличаются значения Cur_Revenue и Prev_Revenue из Product_Staging в таблице Product.

2) Если в Product существует запись для определенной комбинации Account_No и Product_No и если она не существует в таблице Product_Staging, для Cur_Revenue и Prev_Revenue из Product следует установить значение NULL.

3) При наличии совпадения междуAccount_No и Product_No в обеих таблицах и значения выручки одинаковы, таблица Product НЕ должна обновляться.

4) Если в Product существует запись для конкретного Account_No и Product_No со значениями выручки NULL и еслинет записи в Product_Staging для учетной записиСочетание t_No и Product_No НЕ должно обновлять запись продукта.

Product After Update:

Account_No         Product_No        Cur_Revenue             Prev_Revenue
12                 AB                5.0                     3.0 (Updated from Product_Staging)
13                 BC                4.0                     4.0 (Updated from Product_Staging)
16                 DF                                            (Cleared)
17                 CG                NULL                   NULL                            (Cleared)
18                 AZ                NULL                   NULL (Not Updated)

Приведенный ниже запрос работает для достижения результатов # 1 и # 2, но недля № 3 и № 4, и вот где я борюсь.

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

Этот запрос обновляет продукт, даже если значения выручки совпадают в таблице Product и Product_Staging для определенной комбинации Account_No и Product_No.Кроме того, я не уверен, как пропустить обновления записей в Product, когда значения выручки равны NULL, а в таблице Product_Staging нет записей.

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы, кажется, довольно близки, но условия должны быть помещены в ваш компонент 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 )

Надеюсь, это может помешать вашей голове болеть сейчас:)

0 голосов
/ 05 декабря 2018

После прочтения вашего вопроса, я думаю, вам нужно переместить одно условие соединения в case для обновления.Я до сих пор не понимаю, что такое # 2 и где Product2.

...