更新选择使用NULL值连接

时间:2011-06-27 06:33:48

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

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

   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表数量更新STR_IndentDetail表POQty。 我已经根据INNER JOIN和LEFT OUTER编写了两个Update语句。但两个查询仅更新一行,其中列D1,D2,D3和RD中的值。 包含具有NULL值的列RD的行未获得UPDATE。如何为此案例编写更新声明。以下是我的两个更新声明。

基于内部联接:

     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的行。 我想更新这两行。这该怎么做?任何建议请。

2 个答案:

答案 0 :(得分:5)

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

示例

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

<强> NULL Comparison Search Conditions

  

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

     

当SET ANSI_NULLS为ON时,a   比较其中一个或多个   表达式为NULL不会产生   要么是TRUE,要么是FALSE;它产生了   未知。这是因为一个值   未知是无法比拟的   逻辑上反对任何其他价值。   如果表达式是,则会发生这种情况   与文字NULL相比,或者如果   比较两个表达式和一个表达式   它们的计算结果为NULL。对于   例如,以下比较   ANSI_NULLS时总是产生UNKNOWN   打开:

答案 1 :(得分:1)

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