在Oracle中选择没有FROM子句

时间:2009-12-10 15:41:17

标签: sql oracle

SQL Server 中的

可以执行SELECT,而无需引用表;类似的东西:

Select 1.2 +3, 'my dummy string'

由于 Oracle 不允许没有FROM的SELECT,我使用双表进行此类操作;类似的东西:

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

有一种更好的方法来执行此类查询吗?使用双表是好的做法吗?

6 个答案:

答案 0 :(得分:71)

不,在Oracle中没有SELECT没有FROM

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

dual是一个内存表。如果您未从中选择DUMMY,则会使用特殊的访问路径(FAST DUAL),该路径不需要I/O

曾几何时,dual有两个记录(因此名称),并且用作虚拟记录集来复制要加入的记录。

现在它只有一条记录,但你仍然可以用它生成任意数量的行:

SELECT  level
FROM    dual
CONNECT BY
        level <= 100

MySQL也支持dual(以及无法使用的语法)。

答案 1 :(得分:8)

不要忘记大多数时候你实际上并不需要使用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;
...

答案 2 :(得分:4)

  

使用双重是一种好习惯   表

是的,双表通常用于此目的。当你没有可供选择的表时,它在Oracle中非常标准。

答案 3 :(得分:2)

我认为你必须使用双重。当您需要运行没有表名的SQL时使用它。我不能说我在SQL脚本之外使用它来回应日期运行的日期或类似的蠢事。

答案 4 :(得分:2)

是的,双表是在Oracle中执行此操作的常用方法。事实上,它是为此而引入的。

DUAL的主要优点是Oracle中的优化器知道它是特殊的,因此使用它的查询比使用自己制作的单行表更快。除此之外,没有什么特别之处。

答案 5 :(得分:2)

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