【问题标题】:Nested query not grabbing values in oracle from main query in Oracle 11g嵌套查询未从 Oracle 11g 中的主查询中获取 Oracle 中的值
【发布时间】:2018-11-12 15:09:35
【问题描述】:

我在嵌套查询中遇到错误。我试图通过给它一个别名并在子查询中调用它来从父查询中选择 id。如何从 mytable 外部查询中获取 id?

SELECT * FROM mytable t
WHERE (
SELECT count(*) number_of_weekdays FROM
        (
            SELECT start_date, to_char(start_date+(level-1), 'fmday') d_day
            FROM (  select strt_dt as start_date , trunc(sysdate) as end_date from mytable where id = t.id   )
            connect by level <= end_date - start_date + 2 
        )
        WHERE d_day IN (
            select rtrim(ltrim(regexp_substr(intv,'[^,]+', 1, level))) from ( select intv from mytable where id = t.id )
            connect by regexp_substr(intv, '[^,]+', 1, level) is not null
        )

) <= col1

我主要关注的栏目:

INTV                                  | STRT_DT
--------------------------------------------------
3, monday, tuesday, thursday, sunday  | 07-MAY-18

错误:

ORA-00904: "T"."ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"

【问题讨论】:

  • mytableCREATE TABLE 声明是什么?
  • CREATE TABLE mytable (ID NUMBER NOT NULL PRIMARY KEY, CRTD_AT TIMESTAMP(6) NOT NULL, UPDT_AT TIMESTAMP(6) NOT NULL, STRT_DT DATE NOT NULL, END_DT DATE, INTV VARCHAR2(150), COL1 NUMBER(20) , RRNC_PATT VARCHAR2(20) );
  • 样本数据和期望的结果真的很有帮助。
  • @GordonLinoff 我更新了示例数据
  • 根据 SQL 标准,应该支持比“外部”查询低一级的子查询的相关性。但是,Oracle 历史上并不支持它,并且 12.1 和 12.2 的文档仍然说它是被禁止的。但是,它在 10.1 和 11.1 中确实有效,但在 10.2 和 11.2 中这是“固定的”(意味着它会引发错误)。尽管文档仍然说它不受支持,但它确实在 12.1 和 12.2 中工作。所以,这取决于您的 Oracle 版本!

标签: sql oracle oracle11g


【解决方案1】:

从子查询中,您只能引用直接外部查询的数据。您无法跨多个查询和子查询访问数据。

在您的情况下,您有三个级别的子查询,即总共四个级别,您尝试从最内层访问最外层查询的数据。

【讨论】:

  • 将别名a 替换为b 以消除表名和别名之间的歧义。如果你这样做了,它就不再起作用了。如果没有替换 a.a 是指最内层子查询中指定的表 a,而不是您可能想要的最外层查询中的别名 a
  • @Codo_ 啊,我的错。谢谢你的解释!
  • 别等了,我忘了换一个点,导致问题。我现在将别名中的所有as 更改为b,它仍在工作:sqlfiddle.com/#!4/710f7/5
  • 虽然文档一直说不支持超过一级深度的相关性,但实际上它在 10.1、11.1、12.1 和 12.2 版本中支持,但在版本中不支持最高 9.x,在 10.2 和 11.2 中也不支持。
  • 这取决于 Oracle 版本。 OP 使用 11g,但在 12c 中删除了一些限制。
猜你喜欢
  • 2012-01-21
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2018-05-22
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多