更新选择使用NULL值连接

the*_*van 4 sql sql-server sql-server-2005 sql-server-2008 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想用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
Run Code Online (Sandbox Code Playgroud)

基于左连接:

 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
Run Code Online (Sandbox Code Playgroud)

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

Lie*_*ers 5

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

ISNULL(PUR_POIndent.RD, -999) = ISNULL(STR_IndentDetail.RD, -999)
Run Code Online (Sandbox Code Playgroud)

NULL比较搜索条件

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

当SET ANSI_NULLS为ON时,一个或多个表达式为NULL的比较不会产生TRUE或FALSE; 它产生了未知.这是因为未知的值无法与任何其他值进行逻辑比较.如果将表达式与文字NULL进行比较,或者如果比较两个表达式并且其中一个计算结果为NULL,则会发生这种情况.例如,当ANSI_NULLS为ON时,以下比较总是产生UNKNOWN: