【发布时间】:2011-07-14 01:07:30
【问题描述】:
我有一个 CTE 链,最后我想从最后一个中选择两次。 Oracle 允许我做任何一个选择,但不能同时做两个选择(即使我做“select * from (select union select)”。我唯一可以缩小问题范围的就是在两个中引用“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
【问题讨论】:
-
您应该真正编辑您的问题以包含您提供的示例,而不是将其填充在评论中。然后,您将拥有说明示例所需的所有空间和格式。正如香农所说,您可以多次引用 CTE。
-
谢谢,我不知道 questions 和 cmets 有什么区别。
-
主要是“缺少右括号”,但现在,我很尴尬地说,整个事情都在工作。但是我确定昨天只是添加了联合导致了问题,而联合的选择中的任何一个都可以自行工作(当然,我必须删除“正在运行”和我没有选择的“tobe”。非常抱歉。
标签: oracle common-table-expression