0

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?

アプリケーションによって変更される状態が先頭であることを忘れないでください。

誰でも望ましい結果を得るために私を助けることができますか?

4

1 に答える 1

0

マージステートメントを使用できます..このようなもの...

with target_T as (select * from UR_TARGET_TABLE
                  where statesource is not null) -- to dont change the data inserted from application...
merge target_T as TARGET
using UR_SOURCE_TABLE as SOURCE
on SOURCE.id = TARGET.id    -- id is unique? anyway, put your primary key here...

when matched and TARGET.state = TARGET.statesource then --if inserted/updated from application, will not change data
update set TARGET.state = SOURCE.state
          ,TARGET.statesource = SOURCE.state  --important update it together to be different from an application update
        --, other collumns that you have to set...

--should use another when matched then update if need to change something on inserted/updated from application data


when not matched by TARGET then
         insert (Id, Date, Department, Location, PersonId, Starttime, EndTime,State, StateSource)
         values(SOURCE.Id, SOURCE.Date, SOURCE.Department, SOURCE.Location, SOURCE.PersonId, SOURCE.Starttime, SOURCE.EndTime,SOURCE.State, SOURCE.StateSource);

テーブルを宣言し、データを挿入してサンプルを設定した場合...

サンプルだけでなく、実際に機能するコードを使用して、さらに支援する必要があります。

于 2013-01-24T18:27:35.647 に答える