0

我在 Sql Server 2008 中有两个表 -> SchedulePermanent 和 ScheduleImported

时间表永久:

Id StartDate EndDate 值

1 01-01-2013 03-01-2013 100

2 2013 年 3 月 1 日 2013 年 7 月 1 日 200

3 07-01-2013 18-01-2013 300

时间表进口:

Id StartDate EndDate 值

1 01-01-2013 04-01-2013 100

2 04-01-2013 06-01-2013 200

3 06-01-2013 15-01-2013 300

4 15-01-2013 18-01-2013 100

我只想将每天两个计划中不相等的值插入结果表。

示例:(OldValue:存在于永久表中,NewValue 存在于导入表中)

日期 旧值 新值

03-01-2013 200 100

06-01-2013 200 300

15-01-2013 300 100

16-01-2013 300 100

17-01-2013 300 100

18-01-2013 300 100

我是否必须按日期拆分临时表中的每个表,然后对每个日期进行比较,还是有更好的方法?(我看到一些关于Cross join的话题,但我从未使用过它)

谢谢,

4

2 回答 2

0

我认为您不需要交叉连接,您应该只需使用内部连接就可以做到这一点。

select Date, SchedulePermanent.Value as OldValue, ScheduleImported.AsNewValue
from SchedulePermanent 
join ScheduleImported on SchedulePermanent.StartDate = ScheduleImported.StartDate and SchedulePermanent.Value <> ScheduleImported.Value

但是,这仅适用于导入 SchedulePermanent 中已存在的日期的值。要包含尚未永久存在的导入值,它看起来像这样:

    select Date, SchedulePermanent.Value as OldValue, ScheduleImported.AsNewValue
    from SchedulePermanent 
    right join ScheduleImported on SchedulePermanent.StartDate = ScheduleImported.StartDate 
where SchedulePermanent.StartDate is null

如果你想覆盖这些值,那么你可以检查一个合并语句,而不是。

 MERGE SchedulePermanent AS target
    USING (SELECT StartDate, Value from ScheduleImported) AS source 
    ON (target.StartDate = source.StartDate)
    WHEN MATCHED THEN 
        UPDATE SET Value = source.Value
    WHEN NOT MATCHED THEN   
        INSERT (StartDate, Value)
        VALUES (source.StartDate, source.Value)
于 2013-06-13T13:15:23.640 回答
0

获得所有不平等记录的简单方法:

SELECT S.ID, S.StartDate, S.Value
FROM SchedulePermanent AS S
WHERE S.Value NOT EXSIST(
     SELECT VALUE
     FROM CheduleImported AS C
     WHERE C.StartDate = S.StartDate AND C.EndDate = S.EndDate
)
于 2013-06-13T13:42:59.603 回答