1 日に複数回実行する必要があるクエリがあります。このクエリは、データベースから別のデータベースにデータをインポートしています。
ターゲット テーブル構造は次のとおりです。
Id Date Department Location PersonId Starttime EndTime State
1 2012-01-01 2 5 200 12:00:00.000 15:00:00.000 2
アプリケーションは、ターゲット表にデータを挿入することもできます。アプリケーションによって挿入されたレコードは、このレコードが別の状態のソース (一時テーブル) テーブルに存在する場合にも更新されない場合があります。
これを可能にするために、ソリューションを作成しました。確認できるように、ターゲット テーブルに 2 番目の状態の新しい列を作成します。
Id Date Department Location PersonId Starttime EndTime State StateSource
1 2012-01-01 2 5 200 12:00:00.000 15:00:00.000 2 2
いくつかの要件:
アプリケーションによってレコードが追加された場合、StateSource は NULL になります。このレコードは、ソース テーブルから削除、更新、または再度挿入できないことを意味します。
アプリケーションによって Record が更新された場合、State と StateSource の値は異なります。この場合、私はこの記録を更新しません。
ソース テーブルとターゲット テーブルの状態が同じではなく、ターゲット テーブルの値が State = StateSource である場合は更新します。
これがターゲットテーブルに存在しない場合、レコードを挿入します。レコードが既に存在する場合は挿入されません (これがアプリケーションによって追加された場合でも、最初の実行時にクエリによって追加された場合でも)。
ソーステーブルと State=StateSource にレコードが存在しなくなったら、ターゲットからレコードを削除します。
すでに次のクエリがあります。3つの宣言を行うことにしました。
--Delete Statement first
Delete from t
from TargetTable t LEFT JOIN SourceTable s ON t.Id=s.Id
and t.Date=s.Date
and t.departments=s.Department
and t.PersonId=s.PersonId
and t.State=t.StateSource
--Just delete if a date is no more exists from the source table and this records is NOT
--changed by the application (t.State=t.StateSource)
--Update statement second
Update t
set t.State = s.State
From Targettable t INNER JOIN SourceTable s ON t.Id=s.Id
and t.Date=s.Date
and t.departments=s.Department
and t.PersonId=s.PersonId
The problem here is:
--when I have State 2 already in the targettable and in my sourcetable i have
--another state then the state in the targettable changes. This would not be the case.
--Insert Statement thirth
insert into TargetTable (Id, Date, Department, Location, PersonId, Starttime, EndTime,State, StateSource)
select Id, Date, Department, Location, PersonId, Starttime, EndTime,State, StateSource
from SourceTable s
WHERE Date not in (select Date
from TargetTable t
where t.id=s.id
and t.PersonId=s.PersonId
and t.date=s.date
and t.department=s.department)
--I have no idea about how the insert should be because the application also can
--insert records. When a record exists then no insert. What to do with the State?
アプリケーションによって変更される状態が先頭であることを忘れないでください。
誰でも望ましい結果を得るために私を助けることができますか?