在插入多行时,语句“select 1 from dual”的作用是啥?

Posted

技术标签:

【中文标题】在插入多行时,语句“select 1 from dual”的作用是啥?【英文标题】:While inserting multiple rows what does the statement 'select 1 from dual' do?在插入多行时,语句“select 1 from dual”的作用是什么? 【发布时间】:2013-03-13 04:32:46 【问题描述】:

同时使用以下样式将多行插入到表中:

insert all

into ghazal_current (GhazalName,Rating) values('Ajab Apna Haal Hota Jo Visaal-e-Yaar Hota',5)
into ghazal_current (GhazalName,Rating) values('Apne Hothon Par Sajana Chahta Hun',4)
into ghazal_current (GhazalName,Rating) values('Shaam Se Aankh Mein Nami Si Hai',4)
into ghazal_current (GhazalName,Rating) values('Tumhe Yaad Ho Ke Na Yaad Ho',3)

select 1 from dual;

声明select 1 from dual 是什么意思?这里有什么用?

【问题讨论】:

如声明所述,除了选择 1 之外别无其他。 有用的问题,以及 ghazals 的绝妙选择 :) 【参考方案1】:

DUAL 是一个内置表,它很有用,因为它保证为return only one row。这意味着DUAL可以用来获取usersysdate等伪列、计算结果等。 DUAL 的所有者是SYS,但每个用户都可以访问它。 DUAL 在文档中得到了很好的介绍。 Find out more.

在您的情况下,SELECT 1 FROM DUAL; 将简单地返回 1。您需要它,因为 INSERT ALL 语法需要 SELECT 子句,但您不是从表中查询输入值。

【讨论】:

Dual 不是临时表。 那篇文章将其描述为特殊。这和临时的不一样。这是一张永久的桌子。【参考方案2】:

简单重新介绍一排表

一些 SQL 数据库要求所有值都来自 FROM 一个表或类似表的对象,而其他 SQL 数据库允许查询构造值 ex nihilo

-- mysql, sqlite, PostgreSQL, HSQLdb, and many others permit
-- a "naked" select:
SELECT 1;

-- Others *require* a FROM target, like Oracle.
SELECT 1 FROM DUAL;

-- ...and Firebird/Interbase:
SELECT 1 FROM RDB$DATABASE;

-- ...and DB2:
SELECT 1 FROM SYSIBM.SYSDUMMY1;

这里 DUAL 的基数很重要。如果它有不止一行,那么您的结果集将有不止一行。例如,当您SELECT 1 FROM A_Table_With_Ten_Rows 时会发生什么?

为什么在这里使用 DUAL

SQL 构造 VALUES (<row-value-expression>) 是一个行值构造函数。 VALUES (1, 2, 3)SELECT 1, 2, 3 一样“创建”一行值。

当然,Oracle 要求这些值来自 FROM 某处。

作为一个演示,不要在 INSERT ALL 的末尾从 DUAL 中选择,而是尝试一个有 N 行的表,你会看到每个 VALUES() 行都被插入 N 次。

【讨论】:

SELECT 1 FROM dual; 也可以在 MySQL 中使用。 Postgres 也有:VALUES (1);(是的,没有 FROM!)这适用于 Postgres 和 SQL-Server:SELECT y FROM (VALUES (1)) AS x (y); 哦,SELECT 1 也适用于 SQL-Server。 @ypercube,是的。关键是 ora 需要 FROM 用于 SELECT 和 VALUES,而 my/pg/h/lite/etc.不需要它,即使他们可能允许它。我会在回答中澄清。 我的观点(我没有说清楚)是 Postgres 即使没有 SELECT 也允许语法! @ypercube,是的,那(赤裸裸的价值)是一个很酷的功能。 (pg 做了很多正确的事情!)【参考方案3】:

有一些关于在查询中使用对偶的示例:

   select sysdate from dual  /--it returns date of system
    SELECT chr(223) FROM dual /--it returns character of Asciهi code
    select  my_sequence.nextval from dual; /-- It returns the next value of a sequence
    select to_char(sysdate,'yyyy/mm/dd','nls_calendar=persian')from dual 
    /--returns persian date of system

【讨论】:

以上是关于在插入多行时,语句“select 1 from dual”的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 2010 中使用一个插入语句插入多行

SQL:如果存在则更新,否则插入...但对于具有不同值的多行

如何在一条语句中将多行插入 DB2?

MS Access 中的多行插入语句

MySQLi:使用一个准备好的语句插入多行

在多行插入语句 sqlite 上使用触发器