13

クエリ:

SELECT ID, T.c.value('@Address', 'nvarchar(20)' ) as Address
INTO #TMP
FROM TABLE1
    CROSS APPLY XMLData.nodes('/Document') AS T(c)

UPDATE TABLE1
SET HomeAddress = (SELECT TOP 1 t.Address
                   FROM #TMP t
                   WHERE t.ID = ID)

主に、XML フィールドから同じテーブル内の通常のフィールドにデータ OUT をコピーする必要があります。

質問:

  1. すべてのレコードが Table1 で HomeAddress を取得する理由は何ですか?
  2. Table1 の値を更新する唯一の方法は本当に Cursor ですか?
4

3 に答える 3

22
UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on T1.ID = t2.HomeAddressID
and t2.HomeAddress <> t1.address

結合を使用します。テーブルや相関サブクエリを一時的に作成する必要はありません。

表 1 が 1 対多の関係にある場合、これらはそれを処理するためのいくつかの可能性です。1 つだけのレコードを示す値がある場合 (システムには最も重要なアドレスを選択するフィールドがあり、一意性を保証するトリガーで維持されます)、これを試してください。

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
WHERE t1.somefield = 'somevalue'
and t2.HomeAddress <> t1.address

一意のレコードを他のフィールド (最新の日付など) に基づいて作成する必要がある場合は、次のバリエーションを試してください。

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
join (select id, max(somedatefield) from  table1 group by id) t3 on t3.id = t1.id
Where  t2.HomeAddress <> t1.address
于 2013-02-27T17:53:22.697 に答える
4

更新時に、次のようにテーブルを完全に修飾する必要があります。                  

UPDATE TABLE1 SET TABLE1.HomeAddress = (SELECT TOP 1 t.Address  
               FROM #TMP t  
               WHERE t.ID = TABLE1.ID)  
于 2013-02-27T18:02:07.893 に答える