在插入多行时,语句“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
可以用来获取user
或sysdate
等伪列、计算结果等。 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”的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章