【问题标题】:Join derived table with itself将派生表与其自身联接
【发布时间】: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
  1. 加入 states1 表
  2. 加入 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
  1. 自己加入表...这里有问题,我需要自己加入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


【解决方案1】:

根据您的第一个 SELECT 创建一个 VIEW。

【讨论】:

  • 最初没有指定引擎。
【解决方案2】:

Onotole,我认为这个 WITH 很麻烦。

像这样重写这个查询

SELECT 
    derivedTbl.time As t0,
    derivedTbl.state,
    min(rigthTblPart.time) 
FROM
   (SELECT time,newState from ...) AS derivedTbl
   LEFT OUTER JOIN derivedTbl AS rigthTblPart
       ON derivedTbl.Time<rightTblPart.Time 
....

【讨论】:

  • 它抛出一个错误:“derivedTbl 不存在”......它不能记住像临时表这样的子查询
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 2022-01-02
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多