1

2つのテーブルAとBを比較しています。AとBは月です(JANとFEBを使用します)。FEBはJANに属するデータを更新しました。

そのようにデータを更新する必要があります

UPDATE A
SET A.x = B.x, A.y = B.y, A.z = B.z
FROM JAN A, FEB B
WHERE (A.x <> B.x OR A.y <> B.y OR A.z <> B.z) AND A.PK = B.PK

ここで、元のJANテーブルで上記が実行されないようにします。私はそれについてこのように行かなければなりませんか?それとももっと良い方法はありますか?

SELECT *
INTO JAN_UPDATED
FROM JAN

UPDATE A
SET A.x = B.x, A.y = B.y, A.z = B.z
FROM JAN_UPDATED A, FEB B
WHERE (A.x <> B.x OR A.y <> B.y OR A.z <> B.z) AND A.PK = B.PK

編集:すべての元の値と新しいテーブルの更新が必要です

編集:PKを追加

4

2 に答える 2

2

外部結合を使用すると、データを選択して新しいテーブルに入れ、途中で更新することができます。方法は次のとおりです。

SELECT    A.PK,
          COALESCE(B.x, A.x) AS x,
          COALESCE(B.y, A.y) AS x,
          COALESCE(B.z, A.z) AS x,
          other columns as necessary
INTO      JAN_UPDATED
FROM      JAN A
LEFT JOIN FEB B ON A.PK = B.PK AND (A.x <> B.x OR A.y <> B.y OR A.z <> B.z)

結合の左側のJANテーブルであるテーブルはすべてのJAN行を返し、結合の右側の部分は、のFEB対応する行とは異なる一致する行のみを返しますJAN。一致するものがない場合、右側の部分の列はNULLsで埋められます。これで、値を取得するときに、COALESCE()関数が、、、に使用されます。バージョンが最初に試行され、バージョンが一致する場合x(これは一致しない行であり、更新がない行)、次にパーティ(変更されていない行)が試行されます。代わりに値)が使用されます。yzFEBNULLJANFEBJAN

于 2012-05-31T20:11:07.353 に答える
1

元のレコードと更新されたレコードが必要な場合は、次のアプローチが正しいものです。

テーブルに主キーが定義されていないため、他のアプローチに従うことはできません。

間違ったレコードを更新する可能性があるため、ソリューションにはファジーロジックもあります。

于 2012-05-31T15:19:28.357 に答える