MS SqlServer 中的 Oracle“双”表的等价物是啥?

Posted

技术标签:

【中文标题】MS SqlServer 中的 Oracle“双”表的等价物是啥?【英文标题】: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;

【问题讨论】:

【参考方案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 ,而其他解决方案没有提到.

以上是关于MS SqlServer 中的 Oracle“双”表的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer触发器的问题

Oracle:在延迟约束失败的情况下继续插入

额 原来ms sqlserver 中的视图果然是“虚表”哈

将MS SQL SERVER 数据库导入到ORACLE的坑

双网卡环境导致Oracle连接异常

如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?