我有一个查询,我需要每天运行多次。此查询将数据从数据库导入到另一个数据库。
目标表结构是:
Id Date Department Location PersonId Starttime EndTime State
1 2012-01-01 2 5 200 12:00:00.000 15:00:00.000 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。表示不能从源表中删除,更新或再次插入此记录。
如果应用程序更新记录而不是值State和StateSource将不同。在这种情况下,我不会更新此记录。
如果源表和目标表中的状态不相同,并且目标表State = StateSource中的值,我将更新。
当目标表中不存在记录时,我将INSERT一条记录。当记录已经存在时,不要插入(无论第一次运行时是否由应用程序或我的查询添加)。
当我的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?
请记住,应用程序更改的状态是领先的。
任何人都可以帮我找到理想的结果吗?
答案 0 :(得分: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);
如果您设置样本并声明表格并插入一些数据......
我应该提供更多帮助,使用真正有效的代码......不仅仅是样本......