2012-03-20 5 views
2

は、私は、各返されたエントリの内容に応じてループテーブルにエントリーし、更新テーブルtab_Bによってtab_Aエントリーが必要になります。選択して更新します。 SQL Serverの

SELECT item, regBy, MAX(regTime) AS latestUpdateTime 
FROM tab_A 
GROUP BY item, regBy; 

結果はエントリごとにループしなければならないと、次の更新は、各エントリのために実行する必要があります:

UPDATE tab_B 
SET lastUpdated = "data from latestUpdateTime in SQL above" 
lastUpdBy = "data from regBy in SQL above" 
WHERE item = "data from item in SQL above" 

私はTransact SQLに精通していないので、助けていただければ幸いです。あなたはUPDATE table...

SELECT *を交換することで簡単更新ステートメントに、通常のselect文を回すことができる

+3

**テーブル構造を投稿することはできますか?**列名、そのデータ型、可能な制約など。** SQL Serverの** VERSION **は使用していますか? 7.0? 2000? 2005年? 2008年? 2008 R2? –

+1

一般的に、Sqlでは、レコードのセットを更新する方法を考える必要があります。 – HLGEM

答えて

3

これは、あなたが最初に実際にアップデートを適用する前に更新されます何を確認することができます。

Selectステートメント

SELECT * 
FROM tab_B b 
     INNER JOIN (
      SELECT item 
        , regBy 
        , MAX(regTime) AS latestUpdateTime 
     FROM  tab_A 
     GROUP BY 
        item 
        , regBy 
     ) a ON a.item = b.item 

UPDATE文

UPDATE tab_B 
SET lastUpdated = a.latestUpdateTime 
     , lastUpdBy = a.regBy 
FROM tab_B b 
     INNER JOIN (
      SELECT item 
        , regBy 
        , MAX(regTime) AS latestUpdateTime 
     FROM  tab_A 
     GROUP BY 
        item 
        , regBy 
     ) a ON a.item = b.item 

アップデートを確認し、お使いのバージョンによっては、トランザクションを開始し、OUTPUT句を使用することによりだろうもう一つの方法。

BEGIN TRAN 

UPDATE tab_B 
SET lastUpdated = a.latestUpdateTime 
     , lastUpdBy = a.regBy 
OUTPUT INSERTED.* 
FROM tab_B b 
     INNER JOIN (
      SELECT item 
        , regBy 
        , MAX(regTime) AS latestUpdateTime 
     FROM  tab_A 
     GROUP BY 
        item 
        , regBy 
     ) a ON a.item = b.item 

ROLLBACK TRAN   
2

あなたはSQL Serverの2005または以降を使用している場合、あなたはこのような何かを行うことができます。

;WITH TableAData AS 
(
    SELECT 
     item, regBy, regTime, 
     RowNum = ROW_NUMBER() OVER(PARTITION BY item ORDER BY regTime DESC) 
    FROM dbo.tab_A 
) 
UPDATE dbo.tab_B 
SET 
    lastUpdated = a.regTime, 
    lastUpdBy = a.regby 
FROM TableAData a  
WHERE 
    tab_B.item = a.item 
    AND a.RowNum = 1 

基本的には、このCTE(共通テーブル式)は、このような方法であなたのデータを順序付けそれぞれitemに対して、RowNumが計算されます(最新のものはRowNum = 1になります)。

tab_Bを1つのステートメントで簡単に更新できます。行単位で行をループする必要はありません。

関連する問題