【发布时间】:2018-12-08 11:03:12
【问题描述】:
我正在更新我的问题,提供更多细节和我尝试过的东西。
我有两个表 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) 当 Product 中存在 Account_No 和 Product_No 的特定组合的记录,如果 Product_Staging 表中不存在该记录,则 Product 的 Cur_Revenue 和 Prev_Revenue 应设置为 NULL。
3) 当两个表中的 Account_No 和 Product_No 匹配并且收入值相同时,不应更新 Product 表。
4) 如果 Product 中存在特定 Account_No 和 Product_No 的记录且收入值为 NULL,并且如果 Product_Staging 中不存在 Account_No 和 Product_No 组合的记录,则不应更新 Product 记录。
更新后的产品:
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 中更新的记录。
有人可以帮忙吗?
【问题讨论】:
-
您可能应该包括您尝试完成这项工作的内容,以免它看起来像家庭作业问题。
-
另外,请仔细考虑您的要求。如果表A有一行非空值的字段要更新到表B,但表B没有匹配表A的行怎么办?如果表 A 在更新字段中有一个 NULL,但表 B 有一行,应该怎么办? TL;DR - 如果您遇到意外但可预测的情况,请确保您知道该怎么做。
-
为了更加清晰,我去掉了表 A 和表 B 的命名法,并用我尝试过的内容更新了原始帖子。
-
你能解释一下吗 * 当 Product2 中存在 Account_No 和 Product_No 的特定组合的记录,如果 Product_Staging 表中不存在该记录,则 Product2 的 Cur_Revenue 和 Prev_Revenue 应设置为 NULL。* ?什么是product2?
-
对不起,这只是产品表。此表是 Salesforce Product 对象的副本,在 Salesforce 中名称为 Product2。
标签: sql sql-server sql-server-2008 left-join