gpt4 book ai didi

sql - Oracle UNION 和 ORDER BY 的奇怪问题

转载 作者:行者123 更新时间:2023-12-03 12:54:36 25 4
gpt4 key购买 nike

以下查询是 perfectly valid在几乎每个数据库中(提供或获取 dual 虚拟表),包括 Oracle:

select 'A' as x from dual union all
select 'B' from dual
order by x asc

返回:
| X |
|---|
| A |
| B |

现在这个查询还是很标准的SQL,但是 doesn't work在甲骨文
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual
order by x asc

我越来越
ORA-00904: "X": invalid identifier

然而,这 works :
select 'A' as x from dual union all
select 'B' as x from dual union all
select 'C' from dual
order by x asc

我一直在解决这个问题,并发现显然,至少第一个子选择和倒数第二个 (??) 子选择需要有一个名为 x 的列。 .在第一个示例中,两个子选择似乎只是重合。 Working example :
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual union all
select 'D' from dual union all
select 'E' from dual union all
select 'F' as x from dual union all
select 'G' from dual
order by x asc

你可能已经猜到了,这个 wouldn't work :
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual union all
select 'D' from dual union all
select 'E' as x from dual union all
select 'F' from dual union all
select 'G' from dual
order by x asc

有趣的旁注:

派生表似乎不受此限制。 This works :
select * from (
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual
)
order by x asc

题:

这是 Oracle SQL 解析器中的(已知的?)错误,还是语言语法中是否有任何非常微妙的细节,绝对需要第一个和倒数第二个子选择来保存从 ORDER BY 引用的名称的列条款?

最佳答案

这并没有真正回答问题,但它似乎是解析器错误(或“功能”)而不是语言要求。

根据 My Oracle Support,这似乎是作为错误 14196463 提出的,但没有解决就关闭了。在 community thread 3561546 中也有提到.您需要一个 MOS 帐户,或者至少是一个 Oracle 帐户,才能查看其中任何一个。

也有人讨论过 in an OTN thread据我所知,这需要基本的 Oracle 登录名而不是 MOS 帐户。这也没有太多信息,但重复了您的发现,并且还表明该行为至少可以追溯到 9.2.0.8 甚至更早。

The documentation有点含糊,但并不表示这预计会成为问题:

For compound queries containing set operators UNION, INTERSECT, MINUS, or UNION ALL, the ORDER BY clause must specify positions or aliases rather than explicit expressions. Also, the ORDER BY clause can appear only in the last component query. The ORDER BY clause orders all rows returned by the entire compound query.



您正在为您的表达式添加别名并使用它,它并没有说您必须为特定组件添加别名(尽管当然它也没有说您不必)。

该行为似乎与对最终投影有效的别名不一致,并且关于别名的通常规则仅在 order by 子句中有效 - 这似乎介于两者之间。

关于sql - Oracle UNION 和 ORDER BY 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com