如何根据条件使用两个表更新列?

时间:2011-07-29 04:43:20

标签: sql sql-server sql-server-2005 sql-update

我有两个表,例如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   

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)