【发布时间】:2010-12-25 07:24:18
【问题描述】:
在 SQL Server 中可以执行 SELECT,而无需参考表;类似:
Select 1.2 +3, 'my dummy string'
由于 Oracle 不允许没有 FROM 的 SELECT,所以我使用对偶表进行此类操作;类似:
Select 1,2+3, 'my dummy string' FROM DUAL
有更好的方法来进行这种类型的查询吗?使用双表是个好习惯吗?
【问题讨论】:
在 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 语法)。
【讨论】:
@Paul Tomblin:比这更糟。根据您是否从中选择dummy,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;
...
【讨论】:
使用对偶是个好习惯 表
是的,双表通常用于此目的。当您没有可供选择的表时,这在 Oracle 中是相当标准的。
【讨论】:
是的,双表是在 Oracle 中执行此操作的常用方法。其实就是为了这个才引入的。
DUAL 的主要优点是 Oracle 中的优化器知道它是特殊的,因此使用它的查询可以比使用自己创建的单行表更快。除此之外,并没有什么特别之处。
【讨论】:
我认为你必须使用双。当您需要运行没有表名的 SQL 时使用它。我不能说除了在 SQL 脚本中使用它来回显某些东西的运行日期或类似的愚蠢的东西。
【讨论】:
实际上,SQL Server 的实现是非标准的。 SQL-92 Standard(第 7.9 节)需要在 SELECT 语句中使用 FROM 子句。 DUAL 是 Oracle 提供表以从中选择以获取标量行的方式。
【讨论】: