Sql 插入多行时,“select 1 from dual”语句的作用是什么?

Sql 插入多行时,“select 1 from dual”语句的作用是什么?,sql,oracle,oracle11g,multiple-insert,Sql,Oracle,Oracle11g,Multiple Insert,使用以下样式在表中插入多行时: 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) va

使用以下样式在表中插入多行时:

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;

语句从dual中选择1是什么意思?它在这里是做什么用的?

DUAL是一个内置的表,非常有用,因为它保证了。这意味着可以使用DUAL来获取伪列,例如user或sysdate、计算结果等。DUAL的所有者是SYS,但每个用户都可以访问它。文档中详细介绍了双功能


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

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

   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
一行表简介 一些SQL数据库要求所有值都来自表或类似表的对象,而另一些SQL数据库则允许查询在nihilo之外构造值:

这里对偶的基数很重要。如果它有多行,则结果集将有多行。例如,当您从包含十行的表中选择1时,会发生什么情况

为什么这里使用双精度 SQL构造值是一个行值构造函数。值1、2、3创建一行值,就像选择1、2、3一样

当然,Oracle要求这些值来自某个地方


作为演示,不要在“全部插入”末尾从DUAL中进行选择,而是尝试一个包含N行的表,您将看到每个值行都被插入N次。

正如语句所述,除了选择1之外,别无他法。有用的问题和ghazals的精彩选择:DUAL不是临时表。这篇文章将其描述为特殊表。这和临时的不一样。这是一个永久表。从双表中选择1;也可以在MySQL中使用。博士后也有:价值观1;是的,不是的!这适用于Postgres和SQL Server:从值1中选择y作为x y;哦,选择1也可以在SQL Server中工作。@ypercube,是的。关键是ora需要FROM来表示SELECT和VALUES,而my/pg/h/lite/etc不需要FROM,即使他们可能允许这样做。我将在回答中澄清。我没有明确说明的一点是,Postgres允许语法,即使没有SELECT@是的,裸值是一个很酷的特性。pg做了很多正确的事情!
-- 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;