在MS SqlServer中,Oracle的"Dual"表对应的是什么?

79

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

这是我的Select语句:

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

82
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

6
最好将查询更改,而不是在SQL Server中引入“dual”表。 Oracle的优化器将特殊识别“dual”表并跳过访问它。 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1562813956388#19020485993865 - Shannon Severance
1
谢谢,这在Virtuoso开源数据库中也适用。 - nuoritoveri
2
dual 最初是为了某种内部用例而创建的,其中连接到它会复制行,但在某个时间点,情况失控,因为 Oracle 要求使用 FROM 子句,即使所选取的值不需要表也是如此,因此它变得常用于选择。 - Andy
1
当我想像这个例子一样使用 JOIN 子句 时,怎么办呢? 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 ) - AndyDaSilva52
我曾经遇到过类似的问题。我必须在一个自动生成查询语句的框架中编写特定的查询语句。我使用了表 (values('x')) DUAL(DUMMY) 来检索具有 ANY 结果的单列查询结果(粗体为框架生成的内容,斜体为我作为参数提供的内容):SELECT CASE WHEN 'X' = ANY (SELECT COLUMN FROM TABLE) THEN 1 ELSE 0 END RESULT FROM _(VALUES('X')) DUAL(DUMMY)_。它在大多数 SQL 引擎中都能正常工作。 - Lucio Menci

35

在 MSSQL Server 中不需要使用 DUAL

但在 Oracle 中需要

select 'sample' from dual

等于

SELECT 'sample'

在SQL Server中


4
我认为没有必要在接受答案一年后再次回答相同的问题... - Betlista
3
同样的答案,但更加清晰易懂。我尝试运行两个例子,没有使用FROM,结果出现了错误。 - SupermanKelly

6

虽然正如Jean-François Savard所解释的那样,通常情况下在SQL Server中不需要DUAL表,但过去我曾因语法原因需要模拟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)

2
在SQL Server中没有双表。如果你想要使用WHERE子句,可以直接像这样简单地放置它:

SELECT 123 WHERE 1<2

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

SELECT 123 FROM DUAL WHERE 1<2


不确定为什么人们不喜欢Heng的答案 - Heng在之前的答案中进行了扩展,指出您也可以使用没有from子句的where子句,而其他解决方案没有提到这一点。 - TheRealZing

0

其实比那更简单。 使用字面值来确定数据类型。 如果列名需要特殊字符,请在其周围加上引号。 如果您只需要1行数据,则跳过WHERE子句:

SELECT  'XCode' AS XCode
       ,1 AS XID  
       ,'XName' AS "X Name"
       ,'YCode' AS YCode
       ,getDate() AS YID
       ,'YName' AS "Your Name"
 WHERE 1 = 0

0

当你需要基于本地变量连接一些表并从这些表中获取信息时,以下内容可能会有所帮助:

注意:本地变量必须已经存在。

Select  @XCode     as 'XCode '
       ,@XID       as 'XID   '  
       ,x.XName    as 'XName '
       ,@YCode     as 'YCode '
       ,@YID       as 'YID   '
       ,y.YName    as 'YName '
From (Select 1 as tst) t
Inner join Xtab x on x.XID = @XID
Inner join Ytab y on y.YID = @YID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接