2011-07-29 7 views
0

私はSTR_IndentHeaderとSTR_IndentDetailのような2つのテーブルを持っています。条件に基づいて2つのテーブルを使用して列を更新するにはどうすればよいですか?

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 

私はIndentIDに関してSTR_IndentHeader StatusID = 4、すべてのSTR_IndentDetail.ItemIDのItemStatusID = 4を更新したいと思います。そうでなければ、私は、アイテムのすべてのItemStatusIDが4であるので、我々は= 4 更新STR_IndentHeader.StatusIDを持っているIndentID「1」の場合は、STR_IndentDetailでは、上記の表にSTR_IndentHeader.StatusID = 3

を更新したいですしかし、IndentID "2"、1つのアイテム(ItemID = 11)ItemStatusID = 4、残りの2アイテム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をパラメータとして渡しています。 STR_IndentDetailでPUR_POIndentテーブルに基づいて項目とインデントをチェックし、次にSTR_IndentHeaderを更新する必要があります。 – thevan

+0

STR_IndentHeaderのStatusIDをSTR_IndentDetail内のそれに関連付けられた 'MIN(ItemStatusID)'に設定しているか、それを更新したいのですか? – scwagner

答えて

1

は、私はあなたがSTR_IndentHeaderでstatusIDはそのIndentIDためSTR_IndentDetailから最小ItemStatusID値にしたいと仮定しています提供された情報をオフに基づいています。

このような場合は下記てみてください。

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 

EDIT:

オフに基づいてコメントをあなたはstatusIDが、その後4でない場合は、静的3のItemStatusIDを適用する場合

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

これは、SQL Server 2005で利用可能なCROSS APPLYを使用してこれを行う方法の1つです。

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

このクエリは、ヘッダーテーブルのIndentID 2のStatusIDも更新します。 – thevan

+0

PUR_POIndentテーブルを無視します。 STR_IndentDetailとSTR_IndentHeaderに基づいてStatusIDを更新します。私の質問を編集してお待ちください、私はそれが良いアイデアを与えることを願っています。 – thevan

+0

私は自分の質問を編集しました。それを見てください。 – thevan

関連する問題