gpt4 book ai didi

sql - 使用 LEFT OUTER JOIN 从其他表更新表值

转载 作者:行者123 更新时间:2023-12-04 17:42:56 26 4
gpt4 key购买 nike

我有两个表 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

产品:

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

我需要根据以下条件更新 Product 表的 Cur_Revenue 和 Prev_Revenue 字段。

  1. 当两个表中的 Account_No 和 Product_No 匹配且收入值不同时,应在 Product 表中更新 Product_Staging 中的 Cur_Revenue 和 Prev_Revenue。

  2. 如果 Account_No 和 Product_No 的特定组合的记录存在于 Product 中,而 Product_Staging 表中不存在,则 Product 的 Cur_Revenue 和 Prev_Revenue 应设置为 NULL。

  3. 当两个表中的 Account_No 和 Product_No 匹配且收入值相同时,不应更新 Product 表。

  4. 当产品中存在特定 Account_No 和 Product_No 的记录且收入值为 NULL 时,如果 Product_Staging 中不存在 Account_No 和 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

即使某个 Account_No 和 Product_No 组合的 Product 和 Product_Staging 表中的收入值相同,此查询也会更新 Product。此外,当收入值为 NULL 并且 Product_Staging 表中没有记录时,我不确定如何跳过在 Product 中更新记录。

最佳答案

您看起来非常接近,但需要将条件放入您的 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 个条件可以更新您的 Product 表。

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。如果有匹配项,您想要更新其暂存值。所以 SET 直接指向该列。根据 #1,如果匹配,则更新(你有一个值,很好)。根据#2,如果没有匹配,则设置为空(没有匹配,值为空)。所以我们甚至不需要 case/when 条件。

让我们澄清您的条件 3 和 4,以便在不必要时不更新。首先,#3,匹配且收入相同。

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

    ( NOT ps.Product_No IS NULLAND ( p.Cur_Revenue <> ps.Cur_Revenue或者 p.Prev_Revenue <> ps.Prev_Revenue ))

  2. 当产品中存在特定 Account_No 和 Product_No 的记录且收入值为 NULL 时,如果 Product_Staging 中不存在 Account_No 和 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 )

关于sql - 使用 LEFT OUTER JOIN 从其他表更新表值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53637949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com