【问题标题】:Update Select Case Statement in SQL Server:更新 SQL Server 中的 Select Case 语句:
【发布时间】:2012-05-18 15:02:53
【问题描述】:

我编写了以下更新语句来更新 PLN_DU_Vendor 表的 StatusID。

UPDATE 
PLN_DU_Vendor
SET
    PLN_DU_Vendor.StatusID = 2
FROM
    PLN_DU_Vendor 
INNER JOIN PMT_RFDDetail D ON PLN_DU_Vendor.DUID = D.DUID
INNER JOIN PMT_RFDHeader H ON H.RFDID = D.RFDID AND PLN_DU_Vendor.VendorID = H.VendorID
INNER JOIN PLN_LASCO_Header LH ON LH.LASCOID = H.LASCOID AND LH.ReleaseID = PLN_DU_Vendor.ReleaseID
AND PLN_DU_Vendor.VendorDUQuantity = (D.DespatchQuantity + ISNULL(PLN_DU_Vendor.RFDQuantity, 0))
WHERE
     H.RFDID = 10

如果条件

PLN_DU_Vendor.VendorDUQuantity = (D.DespatchQuantity + ISNULL(PLN_DU_Vendor.RFDQuantity, 0))

失败,我需要将 StatusID 更新为 1。如何在同一个更新选择语句中执行此操作。

【问题讨论】:

  • PLN_DU_Vendor.VendorDUQuantity的数据类型是什么?
  • VendorDUQuantity、DespatchQuantity 和 RFDQuantity 的数据类型为十进制(15,3)

标签: sql-server sql-server-2008 select


【解决方案1】:

您似乎希望将JOIN 中的条件作为CASE 语句移动到赋值:

UPDATE 
PLN_DU_Vendor
SET
    PLN_DU_Vendor.StatusID = CASE 
    WHEN PLN_DU_Vendor.VendorDUQuantity = (D.DespatchQuantity + ISNULL(PLN_DU_Vendor.RFDQuantity, 0))
    THEN 2
    ELSE 1
    END
FROM
    PLN_DU_Vendor 
INNER JOIN PMT_RFDDetail D ON PLN_DU_Vendor.DUID = D.DUID
INNER JOIN PMT_RFDHeader H ON H.RFDID = D.RFDID AND PLN_DU_Vendor.VendorID = H.VendorID
INNER JOIN PLN_LASCO_Header LH ON LH.LASCOID = H.LASCOID AND LH.ReleaseID = PLN_DU_Vendor.ReleaseID
WHERE
     H.RFDID = 10

【讨论】:

    【解决方案2】:

    你不能用运算符=比较任何浮点数

    PLN_DU_Vendor.VendorDUQuantity = (D.DespatchQuantity + ISNULL(PLN_DU_Vendor.RFDQuantity, 0))
    

    所以,最好是

    PLN_DU_Vendor.VendorDUQuantity - (D.DespatchQuantity + ISNULL(PLN_DU_Vendor.RFDQuantity, 0)) < ERROR
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 2023-03-08
      • 2015-02-27
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多