在SQLite3中填写表的日期

时间:2014-05-08 15:28:04

标签: sql sqlite

我正在使用SQLite3并遇到以下问题:

我有一个日期表table_dates

+--------+
|  Date  |
+--------+
|20130401|
+--------+
|20130402|
+--------+
|   ...  |
+--------+
|20130830|
+--------+

总信息表table_total

+--------+--------+---------+
|  Date  |   ID   |  Total  |
+--------+--------+---------+
|20130401|   Bob  |    1    |
+--------+--------+---------+
|20130403|   Bob  |    6    |
+--------+--------+---------+
|   ...  |   ...  |   ...   |
+--------+--------+---------+
|20130612|  Jill  |    2    |
+--------+--------+---------+

我想要做的是创建一个新表table_overall,以便我们在ID中的每个table_totaltable_dates中的每个日期都有一条记录。它还应包含一个total列,该列等于total中的table_total,其IDtable_total.Date <= total.Date最大,即

+--------+--------+---------+
|  Date  |   ID   |  Total  |
+--------+--------+---------+
|20130401|   Bob  |    1    |
+--------+--------+---------+
|20130402|   Bob  |    1    |
+--------+--------+---------+
|20130403|   Bob  |    6    |
+--------+--------+---------+
|  ...   |   ...  |   ...   |
+--------+--------+---------+
|20130612|  Jill  |    2    |
+--------+--------+---------+

我试图按照

的方式使用查询
CREATE TEMP TABLE t1 AS SELECT Date FROM table_dates;
CREATE TEMP TABLE t2 AS SEELCT ID FROM table_total GROUP BY ID;
CREATE TEMP Table t3 as SELECT * FROM t1 INNER JOIN t2;

SELECT * FROM table_total as r 
INNER JOIN t3 as t ON 
(r.ID = t.ID AND (SELECT MAX(Date) FROM table_total WHERE Date < t.Date) = r.Date);

但它太慢了,我不确定它是否是正确的。什么是最有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我建议您不要使用TEMP TABLE并执行一个独特的查询,请尝试查看您是否在执行时间方面获得了一些收益:

SELECT
    Date
    ,ID
    ,Total
FROM
    table_total
UNION
SELECT 
    td.Date
    ,tt.ID
    ,tt.Total
FROM
    table_total tt
    INNER JOIN table_dates td
        ON td.Date >= tt.Date
        AND td.Date < (SELECT MIN(tt2.Date) FROM table_total tt2 WHERE tt2.Date > tt.Date)

您没有谈论它,但我可以想象您正在使用SQLite移动应用程序,并且您需要新的table_overall表来执行其他查询...我建议您使用VIEWSELECT进行加入/选择的任何工作,因为移动设备不是为了插入大量数据而设计的。

我在 sqlfiddle 上测试了我的查询,如果您需要更多帮助或解决其他问题,我不确定我是否做了您想做的事情,感觉可以在上面发表评论。