2011-06-27 47 views
3

我有两个表STR_IndentDetail和PUR_POIndent更新选择与NULL连接值

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

+0

但如果超过1行空值的那你怎么比较RD值。那会给你错误的信息。 – KuldipMCA

+0

PUR_POIndent表派生自STR_IndentDetail。所以PUR_POIndent表包含与STR_IndentDetail相同的记录 – thevan

回答

4

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

例如

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

NULL Comparison Search Conditions

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

当SET ANSI_NULLS为ON时,比较 在其中一个或多个所述 表达式是NULL不产生 TRUE或FALSE;它产生 UNKNOWN。这是因为 未知的值无法与逻辑上与任何其他值进行比较的 。 如果表达式为 与文字NULL相比较,或者 两个表达式进行比较,并且其中一个 评估为NULL,则会发生这种情况。对于 例如,下面的比较 总会让步UNKNOWN当ANSI_NULLS 为ON:

+0

非常感谢你Lieven。它的工作正常。 – thevan

1

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