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的行.我想更新这两行.这该怎么做?请提出任何建议.
您无法比较NULL值=.更改条件以使用ISNULL并传递表中不存在的值.
例
ISNULL(PUR_POIndent.RD, -999) = ISNULL(STR_IndentDetail.RD, -999)
Run Code Online (Sandbox Code Playgroud)
比较空值时必须小心.比较的行为取决于SET ANSI_NULLS选项的设置.
当SET ANSI_NULLS为ON时,一个或多个表达式为NULL的比较不会产生TRUE或FALSE; 它产生了未知.这是因为未知的值无法与任何其他值进行逻辑比较.如果将表达式与文字NULL进行比较,或者如果比较两个表达式并且其中一个计算结果为NULL,则会发生这种情况.例如,当ANSI_NULLS为ON时,以下比较总是产生UNKNOWN:
| 归档时间: |
|
| 查看次数: |
3006 次 |
| 最近记录: |