我有两个表,例如STR_IndentHeader和STR_IndentDetail。
STR_IndentDetail:
IndentID ItemID ItemStatusID
-------- ------ ------------
1 22 4
1 23 4
2 11 4
2 12 3
2 13 3
STR_IndentHeader:
IndentID StatusID
-------- -----------
1 1
2 1
这里我想更新STR_IndentHeader StatusID = 4,当所有STR_IndentDetail.ItemID的ItemStatusID = 4时,相对于IndentID。否则我想更新STR_IndentHeader.StatusID = 3。
在上面的表格中,在STR_IndentDetail中,对于IndentID“1”,Items的所有ItemStatusID都是4.所以我们有更新STR_IndentHeader.StatusID = 4。 但是对于IndentID“2”,一个项目(即ItemID = 11)ItemStatusID = 4和剩余两个项目ItemStatusID = 3.所以在这种情况下,我们必须更新STR_IndentHeader.StatusID = 3。 我希望它会给出更好的主意。怎么做?
上述表格的所需结果如下:
STR_IndentHeader:
IndentID StatusID
-------- -----------
1 4
2 3
答案 0 :(得分:1)
以下是使用SQL Server 2005中提供的CROSS APPLY
执行此操作的一种方法。希望有所帮助。
UPDATE SH
SET SH.StatusID = (CASE WHEN DC.DistinctCount = 1 THEN 4 ELSE 3 END)
FROM dbo.STR_IndentHeader SH
CROSS APPLY (
SELECT SD.IndentID
, COUNT(DISTINCT ItemStatusID) AS DistinctCount
FROM dbo.STR_IndentDetail SD
WHERE SH.IndentID = SD.IndentID
GROUP BY SD.IndentID
) DC
答案 1 :(得分:1)
基于提供的信息,我假设您希望STR_IndentHeader中的statusID是来自STR_IndentDetail的最小ItemStatusID值,用于该IndentID。
如果是这种情况,请尝试以下方法:
update STR_IndentHeader
set statusid = minitemstatusid
from
(select indentid,MIN(itemstatusid) as minitemstatusid
from STR_IndentDetail
group by indentid) id
where id.IndentID = STR_IndentHeader.indentid
编辑:
如果您想静态应用ItemStatusID为3(如果statusID不是4)则基于注释:
update STR_IndentHeader
set statusid = case minitemstatusid when 4 then 4 else 3 end
from
(select indentid,MIN(itemstatusid) as minitemstatusid
from STR_IndentDetail
group by indentid) id
where id.IndentID = STR_IndentHeader.indentid
答案 2 :(得分:0)
当我测试它使用您的样本数据设置数据库时,这对我有用:
UPDATE STR_IndentHeader ih
SET StatusID = (SELECT MIN(ItemStatusID) FROM STR_IndentDetail id WHERE id.IndentID = ih.IndentID)
WHERE IndentID IN (SELECT DISTINCT IndentID FROM PUR_POIndent WHERE POID = 8)