【发布时间】:2011-07-04 08:19:15
【问题描述】:
简而言之:
我有事件表: [tbl]
time | newState
1200 | 1
1300 | 2
1400 | 5
我需要把这个表转换成区间表[intervals]:
t0 | t1 | state
1200 | 1300 | 1
1300 | 1400 | 2
限制:SQL 紧凑版
查询:
SELECT leftPart.time AS t0, min(rightPart.time) AS t1, leftPart.newState
FROM tbl AS leftPart
LEFT OUTER JOIN tbl As rightPart
ON leftPart.time<rightPart.time
GROUP BY leftPart.Time,leftPart.newState
当 [tbl] 是数据库中的永久表时,它可以完美运行,但在我的情况下,[tbl] 是从另一个选择子查询派生的!像这样:
(SELECT time,newState
from ...) AS derivedTb
所以,当我尝试这样的事情时:
SELECT derivedTbl.time As t0,derivedTbl.state,min(rigthTblPart.time) FROM
(SELECT time,newState
from ...) AS derivedTbl
LEFT OUTER JOIN with derivedTbl AS rigthTblPart
ON derivedTbl.Time<rightTblPart.Time ...
它抛出错误:“derivedTbl 不存在”...
它的别名下的派生表似乎对更高级别的查询不可见(谢谢,谷歌翻译!))...
有没有办法在查询中存储派生表并在查询的不同部分使用它们? SQL CE 不支持临时表、视图和公用表表达式...
任务详情(如果感兴趣): 我有 2 个事件表:
[states1]
time | state1
1200 | 1
1300 | 2
1400 | 3
[states2]
time | state2
1200 | 0
1230 | 10
1330 | 20
1430 | 30
我需要将它们转换成区间表:
[intervals]
t0 t1 state1 state2
1200 1230 1 0
1230 1300 1 10
1300 1330 2 10
1330 1400 2 20
1400 1430 3 20
1430 NULL 3 30
转化阶段: 1. 总体时间线
(SELECT Time FROM States1
UNION
SELECT Time FROM States2) AS timetbl
- 加入 states1 表
- 加入 states2 表
目前一切顺利:
SELECT states12tbl.time, states12tbl.state1, states2tbl.State AS state2
FROM (SELECT states12tbl_1.time, states12tbl_1.state1, MAX(states2tbl.Time) AS states2time
FROM (SELECT timetbl.time, states1tbl.State AS state1
FROM (SELECT timetbl_1.Time AS time, MAX(States1tbl.Time) AS state1time
FROM (SELECT Time
FROM States1
UNION
SELECT Time
FROM States2) AS timetbl_1 LEFT OUTER JOIN
States1 AS States1tbl ON States1tbl.Time <= timetbl_1.Time
GROUP BY timetbl_1.Time) AS timetbl INNER JOIN
States1 AS states1tbl ON timetbl.state1time = states1tbl.Time
- 自己加入表...这里有问题,我需要自己加入code(3),因为sql ce无法记住临时表...如果您有更好的想法,请分享:)
【问题讨论】:
-
由于SQL CE的限制,必须把完整的子查询贴出来,看看能不能做点什么。否则,您必须编写两次子查询..
-
看来唯一的办法就是写两次子查询,因为在sql ce中根本没有办法存储临时表...子查询真的很难:) ...
-
好吧,添加子查询代码以便我们尝试帮助您,或者删除您的问题,因为没有答案,您将没有答案!
-
子查询是返回表 [time,state] 的任何查询:例如 (SELECT time,newState FROM eventsTimeTbl InnerJoin statesTbl On eventsTimeTbl.Time=statesTbl.Time)...
标签: sql-server-2008 sql-server-ce