在Oracle中select没有FROM子句

SQL Server中可以执行一个SELECT,而不用引用一个表; 就像是:

Select 1.2 +3, 'my dummy string' 

由于Oracle不允许没有FROM的SELECT,所以我使用双表进行这种操作。 就像是:

 Select 1,2+3, 'my dummy string' FROM DUAL 

有一个更好的方法来做这种types的查询? 使用双重表格是一个好习惯?

不,在Oracle中没有没有FROM没有。

使用dual表是一个很好的做法。

dual是一个内存表。 如果不从中selectDUMMY ,则使用不需要I/O的特殊访问path( FAST DUAL )。

曾几何时, dual有两个logging(因此名称),并打算作为虚拟logging集重复loggingjoin。

现在它只有一个logging,但是你仍然可以用它生成任意数量的行:

 SELECT level FROM dual CONNECT BY level <= 100 

MySQL也支持dual (以及从无到有的语法)。

不要忘记,大多数情况下你并不需要使用SELECT。

代替:

 SELECT sysdate INTO l_date FROM dual; SELECT CASE WHEN i = j THEN 0 ELSE 1 END INTO l_foo FROM dual; ... 

您可以使用

 l_date := sysdate; l_foo := CASE WHEN i = j THEN 0 ELSE 1 END; ... 

使用双重表格是很好的做法

是的,双桌通常用于这个确切的目的。 在没有可供select的表格的情况下,这在Oracle中非常标准。

我认为你必须使用双重。 当您需要运行没有表名的SQL时使用它。 我不能说我使用它比在SQL脚本以外的其他东西运行的date或愚蠢的东西。

是的,双表是在Oracle中执行此操作的常用方法。 事实上,这只是为了这个。

DUAL的主要优点在于Oracle中的优化器知道它是特殊的,所以使用它的查询可以比使用自己创build的单行表更快。 除此之外,没有什么特别的。

实际上,SQL Server的实现是非标准的。 SQL-92标准 (第7.9节)在SELECT语句中需要一个FROM子句。 DUAL是Oracle提供从中select以获得标量行的表格的方式。