使用 LEFT OUTER JOIN 从其他 table 更新 Table 值

Update Table value from other table using LEFT OUTER JOIN

我正在用更多细节和我尝试过的东西更新我的问题。

我有两个 tables Product_Staging 和产品。 table的内容如下。

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 

产品:

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 

我需要根据以下条件更新产品 table 的 Cur_Revenue 和 Prev_Revenue 字段。

1) 当Account_No和Product_No在两个table中都匹配,并且收益值不同时,Cur_Revenue和Prev_Revenue 来自 Product_Staging 的应该在产品 table 中更新。

2) 当Account_No和Product_No的某个组合在Product中存在一条记录,如果在Product_Stagingtable中不存在,则[= Product 中的 44=] 和 Prev_Revenue 应设置为 NULL。

3) 当 table 中的 Account_No 和 Product_No 匹配且收入值相同时,不应更新产品 table。

4) 当产品中存在特定 Account_No 和 Product_No 的记录且收入值为 NULL 并且 Product_Staging 中不存在 [=46] 的记录时=] 和 Product_No 组合,不应更新产品记录。

更新后的产品:

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_Staging table 中某个 Account_No 和 Product_No 组合的收入值相同,此查询也会更新产品。另外,我不确定当收入值为 NULL 并且 Product_Staging table.

中没有记录时如何跳过记录在 Product 中更新

有人可以帮忙吗?

再次阅读您的问题后,我认为您需要将一个连接条件移动到 case 以进行更新。不过,我仍然对 #2 以及 Product2 在哪里感到困惑。

update p SET
    p.Cur_Revenue = case 
                        when p.Product_No = ps.Product_No and p.Cur_Revenue != p.Prev_Revenue then ps.Cur_Revenue       --1
                        when ps.Account_No is null or ps.Product_No != p.Product_No then NULL                           --2
                        when p.Product_No = ps.Product_No and p.Cur_Revenue = p.Prev_Revenue then p.Cur_Revenue         --3
                        when p.Product_No != ps.Product_No then p.Cur_Revenue                                           --4
                        else p.Cur_Revenue                                                                              --catch all
                    end
    ,p.Prev_Revenue =case 
                        when p.Product_No = ps.Product_No and p.Cur_Revenue != p.Prev_Revenue then ps.Prev_Revenue      --1
                        when ps.Account_No is null or ps.Product_No != p.Product_No then NULL                           --2
                        when p.Product_No = ps.Product_No and p.Cur_Revenue = p.Prev_Revenue then p.Prev_Revenue        --3
                        when p.Product_No != ps.Product_No then p.Prev_Revenue                                          --4
                        else p.Prev_Revenue                                                                         --catch all
                    end
from Product p
INNER JOIN Product_Staging ps on
    p.Account_No= ps.Account_No

您看起来非常接近,但需要将条件放入您的 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 )

澄清一下,这样你的头就不会痛了。

根据您的示例,您的产品 table 应该更新的条件只有 2...1 和 2。

1 - table 中的匹配项和收入不同,使用分期中的值进行更新。

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

所以让我们考虑一下。您有一个左连接到匹配的产品和帐户上的登台。所以最坏的情况是你要么匹配,要么不匹配。如果您没有匹配项,那么暂存 table 中的所有值都是 NULL。如果有匹配项,您想要更新其暂存值。所以 SET 直接指向该列。根据 #1,如果匹配,则更新(你有一个值,很好)。根据#2,如果没有匹配,则设置为空(没有匹配,值为空)。所以我们甚至不需要 case/when 条件。

现在,让我们澄清一下您的条件 3 和 4,不要在不必要的地方更新。首先,#3,匹配且收入相同...

3) 当 table 中的 Account_No 和 Product_No 匹配且收入值相同时,不应更新产品 table。请注意,整个部分都包含在括号中。 "NOT ps.Product_No IS NULL" 表示它确实找到了与暂存 table 的匹配项。在这种情况下,我们只想在收入中的任何一个不相同时进行更新。因此,这与 1 上的括号进行 AND 运算,或者其他收入不相同(因此 <> )。因此,如果我们有一条匹配记录并且其中一个(或两个)金额不同,我们必须更新它。

(      NOT ps.Product_No IS NULL
   AND (   p.Cur_Revenue <> ps.Cur_Revenue
        OR p.Prev_Revenue <> ps.Prev_Revenue ))

4) 当产品中存在特定 Account_No 和 Product_No 的记录且收入值为 NULL 并且 Product_Staging 中不存在 [=39] 的记录时=] 和 Product_No 组合,不应更新产品记录。

在这里,第一次命中在暂存中不匹配,因此 "ps.Product_No IS NULL",而且,如果在暂存中不匹配,则两个收入字段也必须为空,不需要更新。所以我将这两项收入与为零。如果其中一个或两者都有值,您希望根据要更新的 #2 条件将它们更改为 null。

OR (     ps.Product_No IS NULL
     AND p.Cur_Revenue IS NULL
     AND p.Prev_Revenue IS NULL )

希望这可以防止你的头现在受伤:)