可以执行SELECT,而无需引用表;类似的东西:
Select 1.2 +3, 'my dummy string'
由于 Oracle 不允许没有FROM的SELECT,我使用双表进行此类操作;类似的东西:
Select 1,2+3, 'my dummy string' FROM DUAL
有一种更好的方法来执行此类查询吗?使用双表是好的做法吗?
答案 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提供表格以供选择以获取标量行的方式。