sql - sql Insert到值( 从选择)

  显示原文与译文双语对照的内容

试图使用另一个表格中的输入插入表格。 尽管这对于许多数据库引擎来说是完全可行的,但我总是很难记住一天( MySQL甲骨文SQL ServerInformixDB2 )的正确语法。

是否有一个SQL标准( 例如 SQL-92 ) 发出silver-bullet语法允许我插入这些值,而不用担心底层数据库的日期?

时间:

尝试以下方法:


INSERT INTO table1 ( column1 )
SELECT col1
FROM table2 

这适用于:


Oracle 
MS SQL Server 
MySQL 
Postgres 
SQLite v3 
TeraData 
DB2 
SyBase

@ Shadow_x99:,应该也可以用,所以你也可以有多个列和其他数据作品:


INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;

编辑:我应该提到,我只在访问,SQL 2000/2005/Express, 和PostGres使用了这个语法,所以这些都应该被覆盖。 一位评论者指出,它将与SqlLite3一起工作。

我看到的答案在Informix中都很正常,并且基本上是标准的SQL 。 也就是说,符号:


INSERT INTO target_table[(<column-list>)] SELECT.. . FROM.. .;

Informix一起工作,我希望所有的DBMS都能正常工作。 ( 很久 5以前或者更多年前这就是这类事物,也并不总是支持,它现在可以很好的支持对于这里类型的标准SQL语法和语句合法据我所知那么它将会在确定的列列表是可选的,但是在这种表示法上。) 表示该指标中的列顺序因此,第一列的列出的选择将进入第一篇专栏缺少相应的列列表中的的第一列的结果选择会进入目标表的第一列。

哪些是可以不同的系统与系统之间的各个数据库系统中使用的表示法来标识表- 标准的没有只言片语 inter-database ( 更不用说inter-DBMS了) 操作。 使用 Informix,可以使用以下表示法来标识表:


[dbase[@server]:][owner.]table

也就是说,你可以指定一个数据库,如果该数据库不在当前服务器中,则可以选择标识该数据库的服务器,然后是可选的所有者,点和最终的表名。 SQL标准使用术语架构,Informix调用所有者。 因此,在Informix中,以下任何表示法都可以识别一个表:


table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

一般情况下不需要引用所有者;但是,如果你使用引号,则需要获得正确拼写的所有者名称- 它变为 case-sensitive 。 也就是:


someone.table
"someone".table
SOMEONE.table

全部标识同一个表。 使用 Informix,模式ANSI数据库有轻微的复杂性,其中所有者名称通常转换为 upper-case ( Informix是例外) 。 也就是说,在模式ANSI数据库( 不常用) 中,你可以编写:


CREATE TABLE someone.table (.. . )

系统目录中的所有者名称是"某人",而不是'某人'。 如果将所有者名称括在双引号中,它就像一个带分隔符的标识符。 使用标准 SQL,分隔标识符可以使用很多地方。 只使用 Informix,你可以使用它们的所有者名称--周围同时在其它环境中,Informix会将single-quoted和double-quoted字符串作为字符串处理,而不是分开single-quoted字符串为字符串和double-quoted字符串作为分隔标识符。 ( 当然,只是为了完整,可以设置一个环境变量 DELIMIDENT,可以设置为任何值,但Y 是最安全的- 表示双引号总是环绕分隔标识符,单引号总是环绕字符串。)

请注意,SQL Server 将使用方括号中的[delimited identifiers] 。 对我来说看起来很奇怪,当然不是SQL标准的一部分。

为了从另一个表中获取一个值 INSERT 中的一个值,我在SQLite3中执行了以下操作:


INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT val_2 FROM table_2 WHERE val_2 = something))

大多数数据库遵循基本语法,


INSERT INTO TABLE_NAME
SELECT COL1, COL2.. .
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

我使用的每个数据库都遵循这个语法,即 DB2SQL ServerMY SQLPostgresQL

于中的所有列相关 SELECT part,这个可以做到在不指定上如果你是供应 INSERT INTO 部分中的列值

假设table1有两个列。 这里查询应该有效:


INSERT INTO table1
SELECT col1, col2
FROM table2

这将无法工作( 没有指定 col2的值):


INSERT INTO table1
SELECT col1
FROM table2

我正在使用 MS 。SQL Server 。不知道其他的rdm如何工作。


1--> {Simple Insertion when table column sequence is known}
 Insert into Table1
 values(1,2,...)

2--> {Simple insertion mention column} 
 Insert into Table1(col2,col4)
 values(1,2)

3--> {bulk insertion when num of selected collumns of a table(#table2) are equal to Insertion table(Table1) } 
 Insert into Table1 {Column sequence}
 Select * -- column sequence should be same.
 from #table2

4--> {bulk insertion when you want to insert only into desired column of a table(table1)}
 Insert into Table1 (Column1,Column2.. ..Desired Column from Table1) 
 Select Column1,Column2..desired column from #table2
 from #table2

下面是使用多个表获取源的另一个示例:


INSERT INTO cesc_pf_stmt_ext_wrk( 
 PF_EMP_CODE, 
 PF_DEPT_CODE, 
 PF_SEC_CODE, 
 PF_PROL_NO, 
 PF_FM_SEQ, 
 PF_SEQ_NO, 
 PF_SEP_TAG, 
 PF_SOURCE) 
SELECT
 PFl_EMP_CODE, 
 PFl_DEPT_CODE, 
 PFl_SEC, 
 PFl_PROL_NO, 
 PF_FM_SEQ, 
 PF_SEQ_NO, 
 PFl_SEP_TAG, 
 PF_SOURCE
 FROM cesc_pf_stmt_ext,
 cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
 AND pfl_emp_code=pf_emp_code(+);

COMMIT;

...