Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么Oracle允许在with子句中有几个别名相同的子查询?_Sql_Oracle_Common Table Expression - Fatal编程技术网

Sql 为什么Oracle允许在with子句中有几个别名相同的子查询?

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在这种情况下

这看起来有点滑稽,但Oracle 11g确实允许运行这样的查询

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通常不使用的重复列名?