你如何加入两个delta表?

时间:2014-06-15 00:59:35

标签: 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

表B可能包含数据:

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

你会如何平等地加入这两张桌子?我当前的方法是先对日历应用所有表格,为每个日期生成条目,然后在Date / Key上加入这些结果,但这显然效率很低。

示例所需输出:

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

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

通过此查询我得到了理想的结果(注意mysql语法,你需要更改最大/最小的sql server模拟)

select greatest(a.begin,b.begin), least(a.end, b.end), a.*, b.*
from table1 as a, table2 as b
where
a.begin <= b.end and a.end >= b.begin
order by 1, 2