【问题标题】:MS SQL Server Update or Clear based on matching values基于匹配值的 MS SQL Server 更新或清除
【发布时间】:2019-04-11 02:53:17
【问题描述】:

在我正在处理的场景中,我需要一些帮助。

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

产品:

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

当 Account_No 和 Product_No 匹配时,我需要使用 Product_Staging 表中的内容更新 Product 表的 Cur_Revenue 和 Prev_Revenue 字段,否则清除 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                                            (Cleared)

Product_Staging 中的第 15 行/DF 将被丢弃,因为它在 Product 表中不存在。

有人可以帮忙吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-update


    【解决方案1】:

    你可以尝试使用update .... OUTER 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
    

    sqlfiddle

    如果要设置默认值,但Product表中不存在该行,可以尝试使用ISNULL函数。

    update p SET
    p.Cur_Revenue =  ISNULL(ps.Cur_Revenue,0),
    p.Prev_Revenue = ISNULL(ps.Prev_Revenue,0)
    from Product p
        LEFT JOIN Product_Staging ps on
            p.Account_No= ps.Account_No
    

    【讨论】:

    • 非常好,感谢您的帮助。我正在考虑进行两次更新。第一次更新是清除目标表中的收入值,第二次更新是在存在 INNER JOIN 匹配时更新 Product_Staging 表中的值。您的解决方案要好得多。
    • 嗨,在这方面需要更多帮助。现在,我需要通过 Account_No 和 Product_No 加入,而不是仅仅通过 Account_No 加入。即,当 Account_No 和 Product_No 匹配时,来自 Product_Staging 的收入值应该在 Product 上更新。如果其中任何一个匹配,则应清除产品表上的值。我知道 JOIN 上的 ON 关键字只能有一个参数。我尝试使用 WHERE 子句,但它不起作用。你能帮忙吗?
    • 没关系。我通过谷歌搜索找到了解决方案。我只需要将其他条件与 AND 一起使用。
    • 嗨@D-Shih,需要更多帮助。如果 Product 和 Product_Staging 上的收入值相同,我不想在使用 LEFT OUTER JOIN 时重新更新它。这可能吗?使用 LEFT OUTER JOIN,Product 表中的每条记录都会得到更新。如果 Product 和 Product_Staging 之间的收入值相同,我想跳过更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2013-09-05
    • 2013-08-03
    • 2019-07-15
    • 1970-01-01
    • 2013-02-11
    • 2020-06-11
    相关资源
    最近更新 更多