2011-07-29 79 views
0

我有兩個表,如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」,所有項目的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

我看不出PUR_POIndent與此有什麼關係。你只想在STR_IndentDetail中爲每個IndentID設置'MIN(ItemStatusID),​​或者是巧合? – scwagner

+0

在這裏,我傳遞POID作爲參數。我需要根據PUR_POIndent表和STR_IndentDetail檢查項目和indentid,然後更新STR_IndentHeader。 – thevan

+0

將STR_IndentHeader的StatusID設置爲STR_IndentDetail中與其關聯的「MIN(ItemStatusID)」,或者您想更新它的內容是否是巧合? – scwagner

回答

1

基於斷時提供我假設你想要的statusID在STR_IndentHeader從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 

編輯:

基於關閉評論,如果你想要靜態應用爲3的ItemStatusID如果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

非常感謝。您的查詢幫助我獲得答案 – thevan

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) 
+0

它會拋出錯誤,如ih附近的語法不正確以及關鍵字「where」 – thevan

+0

編輯我的問題時出現錯誤的語法。請看看它。 – thevan

1

這裏有一種方法可以使用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 
+0

此查詢還在Header表中更新IndentID 2的狀態ID – thevan

+0

忽略PUR_POIndent表。根據STR_IndentDetail和STR_IndentHeader更新StatusID。請等待我編輯我的問題,我希望它會給出更好的主意。 – thevan

+0

我編輯了我的問題。請看看它。 – thevan

相關問題