0

私は3つのテーブルを持っています:

  1. ステージング: 毎月挿入される従業員レコードを取得します。
  2. マスター: テーブルには、ステージングの一意のレコードから以前に入力されたすべてのレコードが含まれています。
  3. 変更: すべての変更を追跡します - 主キーはありません。

テーブルには 10 列あります。ステージング テーブルには、毎月約 2,500,000 のレコードがあります。カーソルを使用して、ステージングからマスター テーブルに新しいレコードを挿入できます。

更新に関しては、内部結合を使用して、マスター テーブルに既に存在するステージングからレコードを取得しています。

従業員情報が変更されたかどうかを確認するには、次の行にクエリを実行する必要がありますか?

WHERE Staging.FirstName <> Master.FirstName
   OR Staging.LastName <> Master.LastName
   OR ...

10列についても同様ですが、もっと簡単な方法はありますか?

4

2 に答える 2

1

数百万行に Cursor を使用するのは面白くありません。

EXCEPT/MERGE を見たほうがいいかもしれません

WITH NewAndChanged AS (
    SELECT Stage.Id
          ,Stage.Col1
          ,Stage.Col2
    FROM Stage
  EXCEPT
    SELECT Master.Id
          ,Master.Col1
          ,Master.Col2
    FROM Master
)
MERGE Master
USING NewAndChanged
      ON Master.Id = NewAndChanged.Id
WHEN MATCHED
     THEN UPDATE SET
         Col1 = NewAndChanged.Col1
        ,Col2 = NewAndChanged.Col2
WHEN NOT MATCHED
     THEN INSERT (
              Id
             ,Col1
             ,Col2
          )
          VALUES (
              NewAndChanged.Id
             ,NewAndChanged.Col1
             ,NewAndChanged.Col2
          )
于 2013-10-16T22:22:06.073 に答える