您可以像这样不循环
SELECt p.date, COALESCE(a.value, 0) value, p.grp_no FROM( SELECt grp_no, date FROM ( SELECt grp_no, MIN(date) min_date, MAX(date) max_date FROM tableA GROUP BY grp_no ) q CROSS JOIN tableb b WHERe b.date BETWEEN q.min_date AND q.max_date) p LEFT JOIN TableA a ON p.grp_no = a.grp_no AND p.date = a.date
最里面的子查询每组分别获取最小和最大日期。 然后与进行交叉连接,以TableB
在每个组的最小-
最大范围内生成所有可能的日期。最后,外部选择将外部联接与一起使用,TableA
并用填充value
列以0
用于缺少的日期TableA
。
输出:
| DATE | VALUE | GRP_NO || ------------ | ------- | -------- || 2012-08-06 | 1 | 1 || 2012-08-07 | 0 | 1 || 2012-08-08 | 1 | 1 || 2012-08-09 | 0 | 1 || 2012-08-07 | 2 | 2 || 2012-08-08 | 1 | 2 || 2012-08-09 | 0 | 2 || 2012-08-10 | 0 | 2 || 2012-08-11 | 0 | 2 || 2012-08-12 | 3 | 2 |
这是 SQLFiddle 演示



