开发者

Can one not reference a CTE twice in a query in Oracle?

I have a chain of CTEs, and at the end I want to select from the last one twice. Oracle lets me do either of the selects but not a union of both of them (even if I do "select * from (select union select)". The only thing I could narrow down the problem to was referring to "runinfo" in two selects, but that in and of itself is not the problem as Shannon shows.

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


What is the simpliest query that doesn't work for you?

What is the complete error message?

Oracle does allow a CTE to be referenced twice, but I am not understanding what you are attempting:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜