2011-07-04 48 views
4

總而言之一句話:加入派生表與自身

我有事件表: [TBL]

time | newState 
1200 | 1 
1300 | 2 
1400 | 5 

我需要把這個表格轉換爲間隔表[間隔]:

t0 | t1 | state 
1200 | 1300 | 1 
1300 | 1400 | 2 

限制:SQL COMPACT EDITION

查詢:

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子查詢派生的!像這樣:

(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. 加入國家2臺

這一刻一切順利:

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. 加入表本身...這是問題,我需要自己加入代碼(3),因爲sql ce不能記住臨時表......如果你有更好的主意,請分享:)
+0

SQL CE版本3。5 –

+0

由於SQL CE的限制,您必須發佈完整的子查詢,我們會看看我們是否可以做些什麼。否則,你必須寫子查詢兩次.. –

+0

似乎唯一的選擇是編寫子查詢兩次,因爲沒有辦法在sql ce中存儲臨時表......子查詢真的很難:) ... –

回答

0

根據您的第一個SELECT創建視圖。

+0

sql ce不支持視圖...或不? :) ... –

+0

最初沒有指定引擎。 – Gedrox

-1

Onotole,我認爲這是一個麻煩。

重寫此查詢像

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 
.... 
+0

它會顯示一個錯誤:「derivedTbl does not exist」...它不記得像臨時表的子查詢 –