Как вставлять, обновлять, удалять при импорте данных из таблицы в таблицу?

У меня есть запрос, который мне нужно запускать более одного раза в день. Этот запрос импортирует данные из базы данных в другую.

Структура целевой таблицы:

Id Date Department Location PersonId Starttime EndTime State 1 2012-01-01 2 5 200 12:00:00.000 15:00:00.000 2 

Приложение также может вставлять данные в целевую таблицу. Записи, вставленные приложением, могут не обновляться также, когда эта запись существует в таблице источника (temp table) с другим состоянием.

Чтобы сделать это возможным, я создал решение. Я создам новый столбец в целевой таблице со вторым состоянием, чтобы я мог проверить.

 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. Это означает, что эта запись не может быть удалена, обновлена ​​или вставлена ​​снова из исходной таблицы.

Если запись обновляется приложением, чем значение State и StateSource будут разными. В этом случае я не обновляю эту запись.

Я буду обновлять, если состояние из источника и целевой таблицы не одинаково, а значения из целевой таблицы State = StateSource.

Я буду ВСТАВИТЬ запись, если она не существует в целевой таблице. Когда записи уже существуют, не вставляйте (независимо от того, добавлено ли это приложение или мой запрос при первом запуске).

Я удалю записи из цели, когда их больше нет в моем sourcetable и 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? 

Помните, что состояния, которые были изменены приложением, являются ведущими.

Может ли кто-нибудь помочь мне с желаемым результатом?

вы можете использовать оператор слияния .. что-то вроде этого …

 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); 

если вы установите образец с объявлением таблиц и вставкой некоторых данных …

Я должен помочь больше, с кодом, который действительно работает .. не просто образец …