Можно ли не ссылаться на CTE дважды в запросе в Oracle? - PullRequest
3 голосов
/ 14 июля 2011

У меня есть цепочка CTE, и в конце я хочу выбрать из последнего дважды. Oracle позволяет мне выполнять выборку, но не объединение их обоих (даже если я делаю «выбрать * из (выберите объединение выбора)». Единственное, с чем я мог сузить проблему, это сослаться на «runinfo» в двух выбирает, но это само по себе не является проблемой, как показывает Шеннон.

WITH lastTen AS (
SELECT id
FROM (SELECT autobuild_id,  id, rank() OVER (PARTITION BY autobuild_id ORDER BY id DESC) as rank
      FROM runs
      WHERE status='FINISHED' AND type='FULL' AND build_failed in ('n', 'N'))
WHERE rank <= 10
),

recentAvg AS (
SELECT autobuild_id, avg(elapsed) avgtime
FROM runs
JOIN lastTen ON (runs.id = lastTen.id)
GROUP BY autobuild_id
),

runinfo AS (
SELECT autobuildid, runid, changelist, status, age
FROM (
    SELECT runs.autobuild_id autobuildid, runs.id runid, changelist, runs.status status, runs.create_date, a.avgtime,
       CASE WHEN status = 'RUNNING' THEN TO_NUMBER(sysdate - start_date)*86400 -- in seconds to compare to elapsed
            WHEN status = 'TO BE' THEN TO_NUMBER(sysdate - create_date) -- in days
       END AS age
    FROM runs
    LEFT JOIN recentAvg a ON (runs.autobuild_id = a.autobuild_id)
    )
WHERE (status = 'RUNNING' AND age > avgtime * 1.5)
   OR (status = 'TO BE' AND age > 1)
ORDER BY autobuildid, runid DESC
),

running AS (
SELECT autobuilds.id, name, runid, changelist, runinfo.status, age
FROM runinfo
JOIN autobuilds ON (runinfo.autobuildId=autobuilds.id)
WHERE runinfo.status='RUNNING'
),

tobe AS (
SELECT autobuildid, name, runid, changelist, status, age
FROM (SELECT autobuildid, name, runid, changelist, runinfo.status, age, RANK() OVER (PARTITION BY autobuildid ORDER BY runid DESC) AS rank
     FROM runinfo
     JOIN autobuilds ON (runinfo.autobuildid=autobuilds.id)
     WHERE runinfo.status='TO BE')
WHERE rank=1
)

SELECT * FROM running
UNION ALL
SELECT * FROM tobe

1 Ответ

9 голосов
/ 14 июля 2011

Какой самый простой запрос у вас не работает?

Что такое полное сообщение об ошибке?

Oracle разрешает ссылаться на CTE дважды, но я не понимаючто вы пытаетесь:

SQL> with a as (select * from dual)
  2     , b as (select * from a)
  3     , c as (select * from b)
  4  select *
  5  from b, c
  6  where b.dummy = c.dummy;

D D
- -
X X
...