245

我听说有人提到这张桌子,但不确定它是关于什么的。

4

14 回答 14

249

它是一种带有单个记录的虚拟表,用于在您实际上对数据不感兴趣时​​进行选择,而是希望在 select 语句中获得某些系统函数的结果:

例如select sysdate from dual;

http://www.adp-gmbh.ch/ora/misc/dual.html

于 2008-09-16T15:45:29.483 回答
86

这是一个包含一个元素的虚拟表。它很有用,因为 Oracle 不允许像这样的语句

 SELECT 3+4

您可以通过编写来解决此限制

 SELECT 3+4 FROM DUAL

反而。

于 2008-09-16T15:47:43.083 回答
75

来自维基百科

历史

DUAL 表由 Oracle 公司的 Chuck Weiss 创建,用于提供用于连接内部视图的表:

我在 Oracle 数据字典中创建了 DUAL 表作为基础对象。它本身并不打算被看到,而是在预期被查询的视图中使用。想法是您可以对 DUAL 表执行 JOIN,并在结果中为表中的每一行创建两行。然后,通过使用 GROUP BY,可以汇总生成的连接以显示 DATA 范围和 INDEX 范围的存储量。DUAL 这个名字似乎很适合从一个行创建一对行的过程。1

从上面可能看不出来,但原来的 DUAL 表中有两行(因此得名)。现在它只有一排。

优化

DUAL 原本是一张表,数据库引擎在选择 DUAL 时会对该表进行磁盘 IO。该磁盘 IO 通常是逻辑 IO(不涉及物理磁盘访问),因为磁盘块通常已经缓存在内存中。这导致针对 DUAL 表的大量逻辑 IO。

Oracle 数据库的更高版本已经过优化,即使 DUAL 表仍然存在,数据库也不再对 DUAL 表执行物理或逻辑 IO。

于 2008-09-16T15:49:42.267 回答
23

我认为这篇维基百科文章可能有助于澄清。

http://en.wikipedia.org/wiki/DUAL_table

DUAL 表是一种特殊的单行表,默认情况下出现在所有 Oracle 数据库安装中。它适用于选择伪列,例如 SYSDATE 或 USER 该表有一个名为 DUMMY 的 VARCHAR2(1) 列,其值为“X”

于 2008-09-16T15:44:22.840 回答
10

这是Oracle中的特殊表。我经常用它来计算或检查系统变量。例如:

  • Select 2*4 from dual打印出计算结果
  • Select sysdate from dual打印服务器当前日期。
于 2008-09-16T15:47:25.423 回答
5

一种可以运行命令并返回结果的伪表,例如 sysdate。还可以帮助您检查 Oracle 是否已启动并检查 sql 语法等。

于 2008-09-16T15:45:01.247 回答
5

Oracle 中只有 1 行 1 列的实用程序表。它用于执行许多算术运算,通常可用于需要生成已知输出的地方。

选择 * 从双;

将给出单行,单列名为“DUMMY”,值为“X”,如下所示:

DUMMY
----- 
X
于 2013-10-07T12:11:58.880 回答
2

DUAL 表是一种特殊的单行表,默认情况下出现在所有 Oracle 数据库安装中。适用于选择 SYSDATE 或 USER 等伪列

该表有一个名为 DUMMY 的 VARCHAR2(1) 列,其值为“X”

您可以在http://en.wikipedia.org/wiki/DUAL_table中阅读所有相关信息

于 2008-09-16T15:48:44.233 回答
2

DUAL 在 PL/SQL 开发中是必要的,以使用仅在 SQL 中可用的功能

例如

DECLARE
x XMLTYPE;
BEGIN
SELECT xmlelement("hhh", 'stuff')
INTO x
FROM dual;
END;
于 2008-09-16T15:57:44.510 回答
2

更多关于 DUAL 的事实......

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1562813956388

在这里完成了激动人心的实验,以及汤姆更激动人心的解释

于 2012-01-31T10:30:15.150 回答
0

DUAL 我们主要用于从序列中获取下一个数字。

语法:SELECT 'sequence_name'.NEXTVAL FROM DUAL

这将返回一行一列的值(NEXTVAL 列名)。

于 2014-07-31T07:33:04.837 回答
0

另一种需要的情况 select ... from dual 是,当我们想要使用内置DBMS_METADATA.GET_DDL函数检索不同数据库对象(如 TABLE、FUNCTION、TRIGGER、PACKAGE)的代码(数据定义)时:

select DBMS_METADATA.GET_DDL('TABLE','<table_name>') from DUAL;

select DBMS_METADATA.GET_DDL('FUNCTION','<function_name>') from DUAL;

确实,如今的 IDE 确实提供了查看表的 DDL 的功能,但在 SQL Plus 等更简单的环境中,这确实很方便。

编辑

更一般的情况:基本上,当我们需要在标准 SQL 语句中使用任何 PL/SQL 过程时,或者当我们想从命令行调用过程时:

select my_function(<input_params>) from dual;

这两个秘籍均取自 Josh Juneau 和 Matt Arena 所著的“Oracle PL/SQL Recipes”一书

于 2018-01-17T15:53:00.533 回答
0

DUAL 是特殊的一行一列表,默认情况下出现在所有 Oracle 数据库中。DUAL 的所有者是 SYS。

DUAL 是由 Oracle 数据库与数据函数一起自动创建的表。它总是用于获取操作系统函数(如日期、时间、算术表达式等)

SELECT SYSDATE from dual;  
于 2019-05-13T07:38:55.557 回答
-1

这是一个放入 from 的对象,返回 1 个空行。例如:从对偶中选择1;返回 1

从对偶中选择 21+44;返回 65

从对偶中选择 [sequence].nextval;返回序列中的下一个值。

于 2008-09-16T15:47:54.347 回答