【问题标题】:Can one not reference a CTE twice in a query in Oracle?在 Oracle 的查询中不能两次引用 CTE 吗?
【发布时间】: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


【解决方案1】:

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

完整的错误信息是什么?

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

【讨论】:

  • 虽然我确实看到如果我更改您的示例,删除“c”并将最终选择更改为select * from b union select * from b,它会起作用。所以也许我的 runinfo cte 的双重使用不是问题,但这就是我能想到的。
  • @Clarence:您是否尝试进行“递归”CTE? with CTE as (select ... from X union all select ... from x inner join CTE) select * from CTE?这在 11g R2 之前的 Oracle 中不受支持。 download.oracle.com/docs/cd/E11882_01/server.112/e17118/…。顺便说一句,Oracle 将 with 子句称为子查询分解。有助于了解何时搜索 Oracle 特定信息。
  • 不,不是递归的。完整的查询现在在问题区域中。您可以看到每个查询名称都引用了较早的名称或表。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多