我正在使用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_total
和table_dates
中的每个日期都有一条记录。它还应包含一个total
列,该列等于total
中的table_total
,其ID
和table_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);
但它太慢了,我不确定它是否是正确的。什么是最有效的方法来实现这一目标?
答案 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
表来执行其他查询...我建议您使用VIEW
与SELECT
进行加入/选择的任何工作,因为移动设备不是为了插入大量数据而设计的。
我在 sqlfiddle 上测试了我的查询,如果您需要更多帮助或解决其他问题,我不确定我是否做了您想做的事情,感觉可以在上面发表评论。