sql – 为什么Oracle允许在WITH子句中具有多个具有相同alias_name的子查询?

看起来有点有趣,但是Oracle 11g真的允许这样一个查询运行

with
    a as (select 1 from dual),
    a as (select 2 from dual)
select  *
from    a;

它返回第一个子查询的结果(即1).

我无法想象这样一个特征可能有用的情况.在我的情况下,当我忘记在复制/粘贴后重新命名一个子查询,并且整个查询返回错误/意外的结果,这是一个问题.幸运的是查询很简单,原因立即被检测到.

无论如何,我希望Oracle在这种情况下抛出异常.

那么我的问题是这样的行为是一个特征还是一个bug?
如果功能,哪里可能有用?

谢谢.

BTW,SQLite不允许类似的查询运行并抛出“重复的WITh表名”异常.没有尝试任何其他数据库引擎.

WITH子句也可以与函数一起使用.我不知道这是否可用于11g,但它是12c.所以这个“错误”可能是重载功能所必需的.

例如,该过程使用完全相同的函数两次,具有相同的输入/输出数据类型.

WITH 
   FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN 'date is '|| pid;
END;
  FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN 'date is '|| pid;
END;
SELECT get_date(cast(sysdate as varchar2(20)))
FROM   dual  
;
/

如预期的那样,它返回一个错误:

ORA-06553: PLS-305: previous use of 'GET_DATE' (at line 1) conflicts with this use

但是如果你重载了这个函数,那么它有相同的名称,但接受不同的参数类型,它将会工作.该过程将无错误地运行,并且根据变量数据类型,使用正确的功能.

WITH 
   FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN 'date is '|| pid;
END;
  FUNCTION get_date(pid IN DATE) RETURN VARCHAR2 IS
BEGIN
RETURN pid+1;
END;
SELECT 
get_date(cast(sysdate as varchar2(20))) /*example1*/
--get_date(sysdate)                    /*example2*/
FROM   dual  
;
/

示例1输出:日期为16-MAR-17
示例2输出:17-MAR-17

所以也许能够使用同名的子查询与允许重载的函数有关.虽然它仍然似乎有bug,但我还没有找到关于这个的文档.

http://stackoverflow.com/questions/39525004/why-does-oracle-allow-having-several-subqueries-with-the-same-alias-name-in-a-wi

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:sql – 为什么Oracle允许在WITH子句中具有多个具有相同alias_name的子查询?