Oracle SQL - 了解Dual表的工作原理

Dan*_*anK 4 sql oracle insert

在制作小型测试表的过程中,我偶然发现了以下在线文章:(http://www.techonthenet.com/sql/insert.php),它提供了有关如何在Oracle中插入多行固定值的以下解决方案:

Insert All
Into testTable (key, field1, field2) Values (1, 10, 'a')
Into testTable (key, field1, field2) Values (2, 20, 'b')
Into testTable (key, field1, field2) Values (3, 30, 'c')
Into testTable (key, field1, field2) Values (4, 40, 'd')
Select * from dual;
Run Code Online (Sandbox Code Playgroud)

双重的使用是我以前从未见过的,所以我开始做一些研究,以了解它是如何工作的.我知道这个表是针对某些oracle语法的解决方法,但它如何完​​成这些任务仍然没有为我点击.我知道其他人已经问了一个类似的问题(Oracle SELECT FROM如何使用多个字段进行双重工作)但我还没有看到任何人解释实际情况.

  • 这是一个参考技巧,他们能够使用单值表来实现,或者Oracle中的某些函数只是硬编码,当他们看到双表时会采取不同的行为吗?

  • 更具体地说,引用它如何允许上面的代码基本上循环遍历多个Into ... Values ...语句?

有人可以向我解释一下吗?

Jus*_*ave 6

从功能上讲,dual它只是一个单行表,您恰好可以指望始终存在且始终只有1行.您可以轻松地创建自己的单行表,而不是使用它dual.或者您可以使用您知道将始终返回1行的查询(即select * from all_objects where rownum < 2).

在幕后,Oracle能够针对dual您创建的单行表优化查询.优化器知道该表总是只有1行,因此它可以根据它进行优化.而且,Oracle可以使用"快速双重"操作来消除对表格的需求,以避免执行任何逻辑I/O. 这些优化并不是你在这样的查询中会注意到的那种优点,当你做一些dual紧凑循环来计算各种表达式时,它们可能很有用.

在这种情况下,select * from dual唯一存在是因为多表INSERT语句需要查询作为源.通常,在创建多表时INSERT,您将从源中选择数据并将其中的部分或全部插入到多个表中.但是,在这种情况下,您根本没有实际使用来自SELECT语句的数据,因此无论您选择什么或从中选择数据都无关紧要.