Sql 如何连接两个增量表?

Sql 如何连接两个增量表?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想知道是否有一种明显的方式将我忽略的两张桌子连接起来 如果将数据加载到表中,以便只记录增量,那么如何将不同的表连接在一起?表之间没有明显的连接,因为不能保证日期/键的比例为1:1 鉴于以下简单结构: BeginDate | EndDate | Id | Col1 | Col2 ... 表A可能包含以下数据: 1/1/2014 | 1/7/2014 | 1 | A | i 1/7/2014 | 1/15/2014 | 1 | B | i 1/1/2014 | 1/3/2014 | 1 |

我想知道是否有一种明显的方式将我忽略的两张桌子连接起来

如果将数据加载到表中,以便只记录增量,那么如何将不同的表连接在一起?表之间没有明显的连接,因为不能保证日期/键的比例为1:1

鉴于以下简单结构:

BeginDate | EndDate | Id | Col1 | Col2 ...
表A可能包含以下数据:

1/1/2014 | 1/7/2014  | 1 | A | i
1/7/2014 | 1/15/2014 | 1 | B | i
1/1/2014 | 1/3/2014  | 1 | ABCDEF | 123
1/3/2014 | 1/8/2014  | 1 | FEDCBA | 321
1/8/2014 | 1/15/2014 | 1 | QWERTY | 314
表B可能包含以下数据:

1/1/2014 | 1/7/2014  | 1 | A | i
1/7/2014 | 1/15/2014 | 1 | B | i
1/1/2014 | 1/3/2014  | 1 | ABCDEF | 123
1/3/2014 | 1/8/2014  | 1 | FEDCBA | 321
1/8/2014 | 1/15/2014 | 1 | QWERTY | 314
你如何将这两张桌子平均地连接起来?我目前的方法是根据日历应用所有表,首先为每个日期生成条目,然后在日期/键上加入这些结果,但这显然是非常低效的

所需输出示例:

1/1/2014 | 1/3/2014  | 1 | A | i | ABCDEF | 123
1/3/2014 | 1/7/2014  | 1 | A | i | FEDCBA | 321
1/7/2014 | 1/8/2014  | 1 | B | i | FEDCBA | 321
1/8/2014 | 1/15/2014 | 1 | B | i | QWERTY | 314

您可以根据两个表的时间交集进行连接,例如

SELECT 
    CASE WHEN t1.dt1 >= t2.dt1 THEN t1.dt1 ELSE t2.dt1 END AS dtStart,
    CASE WHEN t1.dt2 >= t2.dt2 THEN t1.dt2 ELSE t2.dt2 END AS dtEnd,
    t1.col1 t1Col1,
    t2.col1 t2Col1,
    t1.col2 t1Col2,
    t2.col2 t2Col2,
    t1.id t1ID,
    t2.id t2ID
FROM dbo.TestTable t1
JOIN dbo.TestTable2 t2 ON
 (t1.dt1 >= t2.dt1 AND t1.dt2 <= t2.dt2)
     OR (t2.dt1 >= t1.dt1 AND t2.dt2 <= t1.dt2)
选择
当t1.dt1>=t2.dt1时,则t1.dt1 ELSE t2.dt1结束为dtStart,
当t1.dt2>=t2.dt2时,则t1.dt2 ELSE t2.dt2结束为dtEnd,
t1.col1 t1Col1,
t2.col1 t2Col1,
t1.col2 t1Col2,
t2.col2 t2Col2,
t1.id t1ID,
t2.id t2ID
来自dbo.TestTable t1
在t2上加入dbo.TestTable2

(t1.dt1>=t2.dt1和t1.dt2=t1.dt1和t2.dt2我通过这个查询得到了想要的结果(注意mysql语法,您需要将最大值/最小值更改为sql server模拟值)

选择最大(a.begin,b.begin)、最小(a.end,b.end)、a.*,b*
表1为a,表2为b
哪里
a、 开始
按1、2顺序订购