什么都没有选择?

Rit*_*ose 80 sql

是否有可能有这样的陈述

SELECT "Hello world"
WHERE 1 = 1
Run Code Online (Sandbox Code Playgroud)

在SQL?

我想知道的主要事情是,我可以从无选择,即没有FROM子句.

OMG*_*ies 124

它在各个供应商之间并不一致 - Oracle,MySQL和DB2支持双重:

SELECT 'Hello world'
  FROM DUAL
Run Code Online (Sandbox Code Playgroud)

...而SQL Server,PostgreSQL和SQLite不需要FROM DUAL:

SELECT 'Hello world'
Run Code Online (Sandbox Code Playgroud)

MySQL确实支持两种方式.

  • 在DB2上,dual称为'sysibm.sysdummy1' (5认同)
  • @Alex:"原来的DUAL表中有两行(因此它的名字),但随后它只有一行." (4认同)
  • 我一直想知道。为什么为幻影表选择术语对偶? (2认同)
  • 在 Postgresql 上,可以创建一个名为“DUAL”的虚拟表并从类似幻像的表执行查询。 (2认同)
  • @AlexBlakemore“我创建了 DUAL 表作为 Oracle 数据字典中的基础对象。它本身并不是要被看到的,而是在预期要查询的视图中使用。这个想法是,您可以执行 JOIN 来DUAL 表并在结果中为表中的每一行创建两行。然后,通过使用 GROUP BY,可以汇总结果连接以显示 DATA 范围和 INDEX 范围的存储量。 DUAL 这个名称似乎很适合从一个行创建一对行的过程”(https://en.wikipedia.org/wiki/DUAL_table) (2认同)

reb*_*ard 25

Oracle中:

SELECT 'Hello world' FROM dual
Run Code Online (Sandbox Code Playgroud)

SQL Server中的双等效项:

SELECT 'Hello world' 
Run Code Online (Sandbox Code Playgroud)

  • 我可以在它后面放一个像“WHERE (SELECT ... )”这样的语句吗? (2认同)

Vad*_*zim 9

以下是来自https://blog.jooq.org/tag/dual-table/的最完整的双数据库支持列表:

在许多其他 RDBMS 中,不需要虚拟表,因为您可以发出如下语句:

SELECT 1;
SELECT 1 + 1;
SELECT SQRT(2);
Run Code Online (Sandbox Code Playgroud)

这些是 RDBMS,上面通常是可能的:

  • H2
  • MySQL
  • 安格尔
  • Postgres
  • SQLite
  • 数据库服务器
  • Sybase ASE

在其他 RDBMS 中,需要虚拟表,就像在 Oracle 中一样。因此,您需要编写以下内容:

SELECT 1       FROM DUAL;
SELECT 1 + 1   FROM DUAL;
SELECT SQRT(2) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

这些是 RDBMS 及其各自的虚拟表:

  • DB2:SYSIBM.DUAL
  • 德比:SYSIBM.SYSDUMMY1
  • H2:可选地支持 DUAL
  • HSQLDB:INFORMATION_SCHEMA.SYSTEM_USERS
  • MySQL:可选地支持 DUAL
  • 甲骨文:双
  • Sybase SQL Anywhere:SYS.DUMMY

Ingres 没有 DUAL,但实际上需要它,因为在 Ingres 中你不能有没有 FROM 子句的 WHERE、GROUP BY 或 HAVING 子句。


chu*_*gtv 7

尝试这个。

单:

SELECT *  FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
Run Code Online (Sandbox Code Playgroud)

多:

SELECT *  FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
Run Code Online (Sandbox Code Playgroud)

此处有更多详细信息:http : //modern-sql.com/use-case/select-without-from

  • 唯一符合 ANSI SQL 的答案!(对于没有指定 dbms 的问题。) (2认同)

Rol*_*ide 6

在SQL Server类型中:

Select 'Your Text'
Run Code Online (Sandbox Code Playgroud)

不需要FROM或者WHERE条款.


pal*_*wim 5

您可以。我在StackExchange Data Explorer查询中使用以下行:

SELECT
(SELECT COUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod' AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes,
(SELECT COUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers
Run Code Online (Sandbox Code Playgroud)

数据交换使用Transact-SQL(SQL Server对SQL的专有扩展)。

您可以通过运行类似以下的查询来自己尝试:

SELECT 'Hello world'
Run Code Online (Sandbox Code Playgroud)