Sql 为什么Oracle允许在with子句中有几个别名相同的子查询?
这看起来有点滑稽,但Oracle 11g确实允许运行这样的查询Sql 为什么Oracle允许在with子句中有几个别名相同的子查询?,sql,oracle,common-table-expression,Sql,Oracle,Common Table Expression,这看起来有点滑稽,但Oracle 11g确实允许运行这样的查询 with a as (select 1 from dual), a as (select 2 from dual) select * from a; 它返回第一个子查询的结果(即1) 我无法想象这样一个功能会有用的情况。在我的例子中,当我在复制/粘贴子查询后忘记重命名它,而整个查询返回错误/意外的结果时,它反而导致了一个问题。幸运的是,查询非常简单,并立即检测到原因 无论如何,我希望Oracle在这种情况下
with
a as (select 1 from dual),
a as (select 2 from dual)
select *
from a;
它返回第一个子查询的结果(即1)
我无法想象这样一个功能会有用的情况。在我的例子中,当我在复制/粘贴子查询后忘记重命名它,而整个查询返回错误/意外的结果时,它反而导致了一个问题。幸运的是,查询非常简单,并立即检测到原因
无论如何,我希望Oracle在这种情况下抛出异常
所以,我的问题是,这样的行为是特性还是bug?
如果是功能,它在哪里有用
谢谢
顺便说一句,SQLite不允许运行类似的查询,并引发“表名重复”异常。还没有尝试任何其他db引擎 它没有什么用处,但它与Oracle处理重复列名的方式一致。with子句也可以与函数一起使用。我不确定这是否适用于11g,但适用于12c。因此,这个“bug”对于重载函数可能是必需的 例如,此过程使用相同的输入/输出数据类型两次使用完全相同的函数
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输出:日期为2017年3月16日
示例2输出:17-MAR-17
因此,能够使用同名子查询可能与允许重载函数有关。尽管它看起来仍然有缺陷,我还没有找到相关的文档。Postgres也不允许这样做。我认为这是一个缺陷——您肯定会对我的Oracle支持提出问题。复制于12.1.0.2。值得注意的是,在“限制”下,没有明确指定
query\u name
必须是唯一的,但需要注意对重复列别名的限制。即使如此,这也没有用,因此可能是疏忽。SQL Server触发器重复指定了公共表表达式名称“a”。请详细说明这一点好吗?Oracle如何处理其他DBMS通常不使用的重复列名?