【问题标题】:SQL stored procedure to update a table column by calculating the difference from 2 other tablesSQL 存储过程通过计算与其他 2 个表的差异来更新表列
【发布时间】:2019-11-11 22:48:19
【问题描述】:

我在 SQL Server 中有 3 个完全相同的表。我正在尝试编写一个存储过程来从 2 个表中获取 2 列的值,并用差异更新第 3 个表。这些是 3 个表:

  • 当前
  • 建议
  • 决赛
  • 我正在传递 rfds_processing_id。它类似于订单号,包含多行,因此必须对 rfds_processing_id、类型、扇区和位置进行匹配。

    我需要匹配 3 个表中的每一行,然后从 Final.qty 中减去 Current.qty 的值,并用差值更新 Proposed.qty。它还需要用 Final.model 的值更新 Proposed.model(当 Proposed.qty > 0 时)。目前它将每一行设置为相同的值。我假设我需要遍历行。那应该是什么样子?

    ALTER PROCEDURE [dbo].[CalculateProposedAntennas]
    (
      @rfds_processing_id uniqueidentifier = null,
      @id uniqueidentifier OUTPUT
    )
    AS
    BEGIN
      SET NOCOUNT ON
    
    UPDATE P 
      SET qty = (F.qty - C.qty) , model = F.model
      FROM Proposed_Antenna P
      INNER JOIN Final_Antenna F
          ON P.rfds_processing_id = F.rfds_processing_id
      INNER JOIN Current_Antenna C
          ON F.rfds_processing_id = C.rfds_processing_id
      WHERE 
          F.rfds_processing_id = C.rfds_processing_id 
          AND F.sector = C.sector 
          AND F.type = C.type
          AND F.position = C.position   
      RETURN
    END
    

    【问题讨论】:

    • 请提供样本输入数据和所需的输出数据。

    标签: sql-server


    【解决方案1】:

    下面的查询应该做你想做的事:

    ALTER PROCEDURE [dbo].[CalculateProposedAntennas]
    (
      @rfds_processing_id uniqueidentifier = null,
      @id uniqueidentifier OUTPUT
    )
    AS
    BEGIN
      SET NOCOUNT ON
    
    UPDATE P 
    SET P.qty = F.qty - C.qty 
       ,P.model = CASE WHEN Proposed.qty > 0 THEN F.model ELSE NULL END
    FROM Proposed_Antenna P
    INNER JOIN Final_Antenna F
          ON F.rfds_processing_id = P.rfds_processing_id AND F.sector = P.sector AND F.type = P.type AND F.position = P.position
    INNER JOIN Current_Antenna C
          ON C.rfds_processing_id = P.rfds_processing_id AND C.sector = P.sector AND C.type = P.type AND C.position = P.position
      RETURN
    END
    

    我强烈建议您在所有三个表中都创建一个 [UID] 列 - 可以如下生成唯一标识符大小写,生成的键是 varbinary 类型,这比连接中的字符串比较要好得多

    select [UID] = HashBytes('MD5',rfds_processing_id+type+sector+position)
    

    【讨论】:

    • 哇,好多好资料!我将为每个创建 UID 列并尝试一下。
    • 您是说如果添加 UID 列和 select UID 语句,我可以删除内部联接吗?
    • 您不能删除连接,但是您不再需要对连接使用多个 AND,您可以使用 F.rfds_processing_id = P.rfds_processing_id AND F.sector = P.sector AND F.type = P.type AND F.position = P.position 而不是 F.UID = P.UID
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2019-10-20
    相关资源
    最近更新 更多