使用 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 )
希望这可以防止你的头现在受伤:)
我正在用更多细节和我尝试过的东西更新我的问题。
我有两个 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 )
希望这可以防止你的头现在受伤:)