在 SQL Server 中可以执行 SELECT,而无需引用表;像这样的东西:
Select 1.2 +3, 'my dummy string'
由于 Oracle 不允许没有 FROM 的 SELECT,因此我使用双表进行此类操作;像这样的东西:
Select 1,2+3, 'my dummy string' FROM DUAL
有更好的方法来执行此类查询吗?使用双表是个好习惯吗?
不,在
Oracle
中,没有SELECT
就没有FROM
。
使用
dual
表是一个很好的做法。
dual
是一个内存表。如果您不从中选择 DUMMY
,它将使用特殊的访问路径 (FAST DUAL
),不需要 I/O
。
曾几何时,
dual
有两条记录(因此得名),旨在用作虚拟记录集来复制要连接的记录。
现在它只有一条记录,但您仍然可以用它生成任意数量的行:
SELECT level
FROM dual
CONNECT BY
level <= 100
MySQL
还支持 dual
(以及 fromless 语法)。
不要忘记,大多数时候您实际上并不需要使用 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;
...
使用双通道是一个很好的做法 表
是的,双表通常就是用于这个目的。当您没有可供选择的表时,这在 Oracle 中是相当标准的。
是的,双表是 Oracle 中执行此操作的常用方法。其实就是为了这个才推出的。
DUAL 的主要优点是 Oracle 中的优化器知道它的特殊性,因此使用它的查询比使用自己创建的单行表更快。除此之外,没有什么特别的。
我认为你必须使用双。 当您需要运行没有表名的 SQL 时使用它。 我不能说我除了在 SQL 脚本中使用它来回显某些东西运行的日期或类似的愚蠢的东西之外,我还没有太多使用它。
实际上,SQL Server 的实现是非标准的。 SQL-92 标准(第 7.9 节)要求 SELECT 语句中包含 FROM 子句。 DUAL 是 Oracle 提供表以从中进行选择以获取标量行的方式。
您现在终于可以删除从 Oracle 23c 开始的可怕的“FROM DUAL”子句。
(我知道这是一个老问题,但当我用谷歌搜索“来自双重”时,它的排名很高,所以我想我应该为像我这样的人提供服务。)