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