【问题标题】:Update Select Join with NULL values使用 NULL 值更新 Select Join
【发布时间】:2011-09-23 06:40:47
【问题描述】:

我有两个表 STR_IndentDetail 和 PUR_POIndent

STR_IndentDetail:

   IndentID   ItemID    POQty     D1      D2       D3        RD
  ---------   -------  ------    ----     ---     ---        ---
    2            1       NULL     10       20      30        NULL
    2            6       NULL     20       40      60        45

PUR_PO缩进:

   POID        IndentID      ItemID     Quantity     D1     D2       D3        RD
  ------      ----------     ------    ----------   ----    ---      ---       ---
    2            2             1           55         10     20      30        NULL
    2            2             6           100        20     40      60         45

我想用 PUR_POIndent 表 Quantity 更新 STR_IndentDetail 表 POQty。 我写了两个基于 INNER JOIN 和 LEFT OUTER 的更新语句。但是这两个查询都只更新了一行在 D1、D2、D3 和 RD 列中具有值的行。 包含具有 NULL 值的 RD 列的行没有得到更新。如何为这种情况编写更新语句。以下是我的两个更新声明。

基于内连接:

     UPDATE STR_IndentDetail
                SET
                    POQty = PUR_POIndent.Quantity
                FROM
                    PUR_POIndent
                WHERE
                    PUR_POIndent.IndentID           = STR_IndentDetail.IndentID AND
                    PUR_POIndent.ItemID             = STR_IndentDetail.ItemID   AND
                    PUR_POIndent.D1                 = STR_IndentDetail.D1       AND
                    PUR_POIndent.D2                 = STR_IndentDetail.D2       AND
                    PUR_POIndent.D3                 = STR_IndentDetail.D3       AND
                    PUR_POIndent.RD = STR_IndentDetail.RD 
                    AND PUR_POIndent.POID = 2

基于左连接:

 UPDATE STR_IndentDetail
                SET
                    POQty = PUR_POIndent.Quantity       
                FROM
                    STR_IndentDetail LEFT OUTER JOIN PUR_POIndent ON
                    PUR_POIndent.IndentID           = STR_IndentDetail.IndentID AND
                    PUR_POIndent.ItemID             = STR_IndentDetail.ItemID   AND
                    PUR_POIndent.D1                 = STR_IndentDetail.D1       AND
                    PUR_POIndent.D2                 = STR_IndentDetail.D2       AND
                    PUR_POIndent.D3                 = STR_IndentDetail.D3       AND
                    PUR_POIndent.RD = STR_IndentDetail.RD        WHERE 
                        PUR_POIndent.POID = 2

两个查询都忽略 RD 值为 NULL 的行。 我想更新这两行。这个怎么做?请有任何建议。

【问题讨论】:

  • 但如果空值超过 1 行,那么如何比较 RD 的值。这会给你错误的信息。
  • PUR_POIndent 表派生自 STR_IndentDetail。所以 PUR_POIndent 表包含与 STR_IndentDetail 相同的记录

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


【解决方案1】:

PUR_POIndent.RD=STR_IndentDetail.RD OR 
(PUR_POIndent.RD IS NULL AND STR_IndentDetail.RD IS NULL)

【讨论】:

    【解决方案2】:

    您无法将 NULL 值与 = 进行比较。将条件更改为使用 ISNULL 并传递表中不存在的值。

    示例

    ISNULL(PUR_POIndent.RD, -999) = ISNULL(STR_IndentDetail.RD, -999)
    

    NULL Comparison Search Conditions

    比较 null 时必须小心 价值观。比较行为 取决于 SET 的设置 ANSI_NULLS 选项。

    当 SET ANSI_NULLS 为 ON 时,一个 比较其中一项或多项 表达式为 NULL 不会产生 对或错;它产生 未知。这是因为一个值 未知无法比较 逻辑上反对任何其他值。 如果任一表达式为 与文字 NULL 相比,或者如果 比较两个表达式,一个 其中评估为 NULL。为了 例如,下面的比较 ANSI_NULLS 时总是产生 UNKNOWN 开启:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2015-11-05
      • 2015-05-25
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多