我想知道是否有一种明显的方法可以加入我正在忽略的两张桌子。
如果将数据加载到表中以便仅记录增量,那么如何将不同的表连接在一起?表之间没有明显的连接,因为日期/密钥
不能保证日期匹配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
答案 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