Как обновить столбец, используя две таблицы в зависимости от условий? - PullRequest
0 голосов
/ 29 июля 2011

У меня есть две таблицы, такие как 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

Здесь я хочу обновить STRID_IndentHeader StatusID = 4, когда для всех STR_IndentDetail.ItemID ItemStatusID = 4 относительно IndentID. В противном случае я хочу обновить STR_IndentHeader.StatusID = 3.

В вышеприведенных таблицах, в STR_IndentDetail, для IndentID "1", все 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 ]

1 голос
/ 29 июля 2011

Вот один из способов сделать это, используя CROSS APPLY, доступный в SQL Server 2005. Надеюсь, это поможет.

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 голос
/ 29 июля 2011

Исходя из предоставленной информации, я предполагаю, что вы хотите, чтобы statusID в STR_IndentHeader был наименьшим значением ItemStatusID из STR_IndentDetail для этого 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
0 голосов
/ 29 июля 2011

Это сработало для меня, когда я протестировал настройку базы данных с вашими примерами данных:

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)
...