web-dev-qa-db-ja.com

一時テーブルから更新

クエリ:

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)

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

質問:

  1. すべてのレコードがTable1のHomeAddressを取得する理由は何ですか?
  2. Table1の値を更新する唯一の方法は、カーソルですか?
11
SF Developer
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
22
HLGEM

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

表1を更新
SET TABLE1.HomeAddress =(SELECT TOP 1 t.Address
FROM #TMP t
WHERE t.ID = TABLE1.ID)

2
SF Developer
SELECT P.TipoComprob,P.NoComprob,C.Importe as ImpIVA1,ROUND(100/P.ImpGravado*C.Importe,1)
 as PorcIVA1 
       INTO #Temporal
       FROM ComprobProv AS P
       LEFT JOIN PasesCompras AS C ON C.TipoComprob=P.TipoAsiento AND 
C.NoComprob=P.NoComprob
WHERE P.PorcIVA1 =0 and P.CatIVA = 'Ri' AND P.ImpGravado>0 AND C.CodCuenta=110303010 AND ROUND(100/P.ImpGravado*C.Importe,1) IN (21.00,10.50,27.00);
go

select * from #Temporal;
go

UPDATE 
   t1 
SET 
   t1.ImpIVA1 =  t2.ImpIVA1, t1.PorcIVA1 = t2.PorcIVA1
FROM
   dbo.ComprobProv t1
   INNER JOIN #Temporal t2
   ON t1.TipoComprob = t2.TipoComprob AND t1.NoComprob = t2.NoComprob;
go

-'GO'はSQL Server 2017のコンテキストを維持するために重要であることに注意してください。そうしないと、 '不明なフィールド名'エラーが見つかります。