【问题标题】:Select without a FROM clause in Oracle在 Oracle 中选择不带 FROM 子句
【发布时间】: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 oracle


    【解决方案1】:

    不,在Oracle 中没有SELECT 没有FROM

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

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

    曾几何时,dual 有两条记录(因此得名),并打算用作一个虚拟记录集来复制正在连接的记录。

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

    SELECT  level
    FROM    dual
    CONNECT BY
            level <= 100
    

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

    【讨论】:

    • 不知道双重的历史。只要确保 dual 只包含一行。我见过有各种东西的双桌。保证长时间有趣的错误搜索。
    • 有点像 /dev/null 被普通文件替换?
    • @Paul Tomblin:比这更糟。根据您是否从中选择dummy,dual 使用不同的访问路径。
    • 这里有一个来自 Tom Kyte 的很好的链接,它涉及 Dual 的某些方面:asktom.oracle.com/pls/asktom/…
    • 您知道 Oracle 是否考虑过放弃 FROM 子句要求吗?从 dual 中选择对我来说似乎很荒谬和 hacky,我不敢相信 Oracle 从来没有解决过这个问题。
    【解决方案2】:

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

    【讨论】:

    • +1 如果您没有从任何表中获取任何数据,请不要执行查询,您可以在 PL/SQL 中完成所有操作。
    【解决方案3】:

    使用对偶是个好习惯 表

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

    【讨论】:

    • 这就是我从不使用 Oracle 的原因。它已经从根本上死了。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2018-04-03
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          • 1970-01-01
          • 1970-01-01
          • 2018-07-23
          • 2012-07-04
          • 1970-01-01
          相关资源
          最近更新 更多