oracle - 在 Oracle 的查询中不能两次引用 CTE 吗?

标签 oracle common-table-expression

我有一个 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

最佳答案

最简单的查询对您不起作用?

完整的错误信息是什么?

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

关于oracle - 在 Oracle 的查询中不能两次引用 CTE 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687406/

相关文章:

mysql - SQL 查询从两个表中选择并与第三个表进行比较

SQL - 使用一个 CTE 到另一个 CTE 的引用

sql - Postgresql 中此 CTE 的正确方法

mysql - 将值从 Select 传递到 MySQL 中的 CROSS JOIN CTE

java - 从 Java 运行 Oracle 查询

当 SQL 包含带有 LIKE 的参数时,不使用 Oracle 语言索引

oracle - 清除 Oracle session 状态

java - 如何回滚除异常之外的所有内容以存储在表中

sql - SQL Server CTE 中的 WHERE EXISTS 中的引用列?

sql - 使用 SQL Server 递归公用表表达式获取文件夹中所有文件的完整路径(带子文件夹)