在Oracle中选择没有FROM子句

RRU*_*RUZ 44 sql oracle

SQL Server中可以执行SELECT,而无需引用表; 就像是:

Select 1.2 +3, 'my dummy string'
Run Code Online (Sandbox Code Playgroud)

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

Select 1,2+3, 'my dummy string' FROM DUAL
Run Code Online (Sandbox Code Playgroud)

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

Qua*_*noi 76

不,Oracle没有SELECT没有FROM.

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

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

曾几何时,dual有两个记录(因此名称),并打算作为一个虚拟记录集来复制加入的记录.

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

SELECT  level
FROM    dual
CONNECT BY
        level <= 100
Run Code Online (Sandbox Code Playgroud)

MySQL也支持dual(以及无语法).

  • 不知道双重的历史.只需确保双重只包含一行.我看过双表中有各种各样的东西.长期有趣的bug捕获的保证. (2认同)
  • 这里有一个来自Tom Kyte的好链接,它涉及到Dual的某些方面:http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 ::::P11_QUESTION_ID:1562813956388 (2认同)

Vin*_*rat 8

不要忘记大多数时候你实际上并不需要使用SELECT.

代替:

SELECT sysdate INTO l_date FROM dual;
SELECT CASE WHEN i = j THEN 0 ELSE 1 END INTO l_foo FROM dual;
...
Run Code Online (Sandbox Code Playgroud)

您可以使用

l_date := sysdate;
l_foo  := CASE WHEN i = j THEN 0 ELSE 1 END;
...
Run Code Online (Sandbox Code Playgroud)