Присоединяй производную таблицу к себе - PullRequest
4 голосов
/ 04 июля 2011

Короче говоря:

У меня есть таблица событий: [TBL]

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

Мне нужно преобразовать эту таблицу в таблицу интервалов [интервалы]:

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! как это:

(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 ...

Выдает ошибку: "производная таблица не существует" ...

Похоже, что производная таблица под псевдонимом не видна для запроса более высокого уровня (спасибо, переводчик Google!)) ...

Есть ли способ сохранить производные таблицы в запросе и использовать их в разных частях запроса? 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. присоединение к таблице состояний1
  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 не может запомнить временные таблицы ... Если у вас есть идея получше, поделитесь :)

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Онотоль, я думаю, что это СО создает проблему.

переписать этот запрос как

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 голосов
/ 04 июля 2011

Создайте ВИД на основе вашего первого SELECT.

...