【问题标题】:What is the equivalent of the Oracle "Dual" table in MS SqlServer?MS SqlServer 中的 Oracle“双”表的等价物是什么?
【发布时间】:2015-04-06 22:10:52
【问题描述】:

MS SqlServer 中的 Oracle “Dual”表的等价物是什么?

这是我的Select

SELECT pCliente,
       'xxx.x.xxx.xx' AS Servidor,
       xxxx AS Extension,
       xxxx AS Grupo,
       xxxx AS Puerto
FROM DUAL;

【问题讨论】:

    标签: sql-server oracle dual-table


    【解决方案1】:

    sql-server,没有dual你可以简单的做

    SELECT pCliente,
           'xxx.x.xxx.xx' AS Servidor,
            xxxx AS Extension,
            xxxx AS Grupo,
            xxxx AS Puerto
    

    但是,如果您的问题是因为您从 Oracle 传输了一些引用 dual 的代码,您可以重新创建表:

    CREATE TABLE DUAL
    (
    DUMMY VARCHAR(1)
    )
    GO
    INSERT INTO DUAL (DUMMY)
    VALUES ('X')
    GO
    

    【讨论】:

    • 最好更改查询,而不是在 SQL Server 中引入dual 表。 Oracle 的优化器将双表识别为特殊并跳过访问它,asktom.oracle.com/pls/asktom/…
    • 谢谢,这也适用于 Virtuoso 开源数据库。
    • dual 最初是为一些内部用例创建的,在该用例中加入它会复制行,但在某些时候事情失控了,因为 Oracle 愚蠢地需要 @ 987654331@ 子句即使选择的值不需要表格。
    • 什么时候我想使用JOIN clause 就像在这个例子中SELECT * FROM ( SELECT 'COL1' COL1, 'COL2' COL2, M FROM DUAL FULL OUTER JOIN (SELECT 'COL3-ROW1' M FROM DUAL UNION ALL SELECT 'COL3-ROW2' M FROM DUAL) ON 1=1 ) 一样
    • 我遇到了类似的问题。我必须在自己编写查询的框架中编写特定的查询。我使用表(values('x')) DUAL(DUMMY) 从一个查询中检索结果,该查询有一个带有ANY 结果的单列(粗体表示框架,斜体表示我作为参数输入的内容):SELECT 'X' = ANY 的情况(从表中选择列)然后 1 ELSE 0 结束结果 FROM (VALUES('X')) DUAL(DUMMY) 。它适用于大多数 SQL 引擎。
    【解决方案2】:

    mssql server 中不需要 DUAL

    在甲骨文中

    select 'sample' from dual
    

    等于

    SELECT 'sample'
    

    在 sql 服务器中

    【讨论】:

    • 我认为没有理由在接受答案一年后回答同样的问题......
    • 相同的答案但更清晰。话虽如此,我在没有 FROM 的情况下运行了两个示例并得到了错误。
    【解决方案3】:

    虽然您通常不需要 SQL Server 中的 DUAL 表,正如 Jean-François Savard 所解释的那样,但我过去出于语法原因需要模拟 DUAL。以下是三个选项:

    创建DUAL 表或视图

    -- A table
    SELECT 'X' AS DUMMY INTO DUAL;
    
    -- A view
    CREATE VIEW DUAL AS SELECT 'X' AS DUMMY;
    

    创建后,您可以像在 Oracle 中一样使用它。

    使用公用表表达式或派生表

    如果您只需要 DUAL 来作为单个查询的范围,也可以这样做:

    -- Common table expression
    WITH DUAL(DUMMY) AS (SELECT 'X')
    SELECT * FROM DUAL
    
    -- Derived table
    SELECT *
    FROM (
      SELECT 'X'
    ) DUAL(DUMMY)
    

    【讨论】:

      【解决方案4】:

      在 SQL Server 中没有双表。如果你想放一个WHERE子句,你可以简单的直接这样放:

      SELECT 123 WHERE 1<2

      我认为在 MySQL 和 Oracle 中,他们需要一个 FROM 子句才能使用 WHERE 子句。

      SELECT 123 FROM DUAL WHERE 1<2

      【讨论】:

      • 不确定为什么人们不喜欢 Heng 的答案 - Heng 扩展了之前的答案,Heng 指出您也可以使用 where 子句而不使用 from ,而其他解决方案没有提到.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2010-09-29
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2013-06-02
      相关资源
      最近更新 更多