Oracle 中不带 FROM 子句的选择

问题描述 投票:0回答:7

SQL Server 中可以执行 SELECT,而无需引用表;像这样的东西:

Select 1.2 +3, 'my dummy string'

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

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

有更好的方法来执行此类查询吗?使用双表是个好习惯吗?

sql oracle-database
7个回答
99
投票

不,在

Oracle
中,没有
SELECT
就没有
FROM

使用

dual
表是一个很好的做法。

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

曾几何时,

dual
有两条记录(因此得名),旨在用作虚拟记录集来复制要连接的记录。

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

SELECT  level
FROM    dual
CONNECT BY
        level <= 100

MySQL
还支持
dual
(以及 fromless 语法)。


11
投票

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

4
投票

使用双通道是一个很好的做法 表

是的,双表通常就是用于这个目的。当您没有可供选择的表时,这在 Oracle 中是相当标准的。


4
投票

是的,双表是 Oracle 中执行此操作的常用方法。其实就是为了这个才推出的。

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


2
投票

我认为你必须使用双。 当您需要运行没有表名的 SQL 时使用它。 我不能说我除了在 SQL 脚本中使用它来回显某些东西运行的日期或类似的愚蠢的东西之外,我还没有太多使用它。


2
投票

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


0
投票

您现在终于可以删除从 Oracle 23c 开始的可怕的“FROM DUAL”子句。

(我知道这是一个老问题,但当我用谷歌搜索“来自双重”时,它的排名很高,所以我想我应该为像我这样的人提供服务。)

© www.soinside.com 2019 - 2024. All rights reserved.