我正在努力 INSERT INTO 使用另一个表的输入的表。尽管这对于许多数据库引擎是完全可行的,但我似乎总是很难记住 SQL 今天的引擎(mysql、oracle、sqlserver、informix和db2)。是否有一个来自sql标准(例如sql-92)的银弹语法允许我插入值而不必担心底层数据库?
INSERT INTO
SQL
aelbi1ox1#
如果要使用插入所有列,可以尝试此操作 SELECT * INTO table。
SELECT * INTO
SELECT * INTO Table2 FROM Table1;
bakd9h0s2#
这可以在不指定 INSERT INTO 如果要为 SELECT 部分。假设table1有两列。此查询应适用于:
SELECT
INSERT INTO table1 SELECT col1, col2 FROM table2
这不起作用(对于 col2 (未指定):
col2
INSERT INTO table1 SELECT col1 FROM table2
我正在使用ms sql server。我不知道其他RDM是怎么工作的。
t1rydlwq3#
而不是 VALUES 部分 INSERT 查询,只需使用 SELECT 查询如下。
VALUES
INSERT
INSERT INTO table1 ( column1 , 2, 3... ) SELECT col1, 2, 3... FROM table2
olhwl3o24#
insert-into和select子查询的两种方法。使用select子查询返回一行结果。使用select子查询返回多行结果。1使用select子查询返回一行结果的方法。
INSERT INTO <table_name> (<field1>, <field2>, <field3>) VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
在这种情况下,它假设select子查询只返回一行基于where条件或sql聚合函数(如sum、max、avg等)的结果,否则它将抛出错误2返回多行结果的with select子查询的方法。
INSERT INTO <table_name> (<field1>, <field2>, <field3>) SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;
第二种方法适用于这两种情况。
yvgpqqbh5#
下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个Map表:
insert into StudentCourseMap (StudentId, CourseId) SELECT Student.Id, Course.Id FROM Student, Course WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'
(我意识到匹配学生姓名可能会返回多个值,但你明白了。当id是标识列且未知时,有必要对id以外的内容进行匹配。)
5vf7fwbs6#
在insert中使用select子句的括号即可。例如:
INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3) VALUES ( 'col1_value', 'col2_value', (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'), 'col3_value' );
bwitn5fc7#
下面是另一个使用多个表获取源的示例:
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;
zf2sa74q8#
表列顺序已知时的简单插入:
Insert into Table1 values(1,2,...)
简单插入列:
Insert into Table1(col2,col4) values(1,2)
当表(#table2)的选定列数等于插入表(table1)时进行批量插入
Insert into Table1 {Column sequence} Select * -- column sequence should be same. from #table2
批量插入当您只想插入到表(表1)的所需列中时:
Insert into Table1 (Column1,Column2 ....Desired Column from Table1) Select Column1,Column2..desired column from #table2 from #table2
vwhgwdsa9#
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME) SELECT COLUMN_NAME FROM ANOTHER_TABLE_NAME WHERE CONDITION;
apeeds0o10#
大多数数据库都遵循基本语法,
INSERT INTO TABLE_NAME SELECT COL1, COL2 ... FROM TABLE_YOU_NEED_TO_TAKE_FROM ;
我使用的每个数据库都遵循这个语法, DB2 , SQL Server , MY SQL , PostgresQL
DB2
SQL Server
MY SQL
PostgresQL
wpx232ag11#
postgres支持下一步:创建表company.monitor2作为select*from company.monitor;
kgsdhlau12#
这对我有用:
insert into table1 select * from table2
这个句子和甲骨文的有点不同。
nhn9ugyo13#
我看到的这两个答案在informix中都能很好地工作,基本上都是标准sql。即符号:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
可以很好地与informix和所有dbms配合使用(在5年或更长的时间以前,mysql并不总是支持这种东西;它现在对这种标准的sql语法有了很好的支持,而且,对这种表示法来说,它还可以工作。)列列表是可选的,但它按顺序指示目标列,因此select结果的第一列将进入第一列,以此类推,在没有列列表的情况下,select结果的第一列进入目标表的第一列。不同系统之间的区别在于用于标识不同数据库中的表的符号-该标准对数据库间(更不用说数据库间)操作没有任何规定。对于informix,您可以使用以下符号来标识表:
[dbase[@server]:][owner.]table
也就是说,您可以指定一个数据库,如果该数据库不在当前服务器中,可以选择标识承载该数据库的服务器,后跟可选的所有者dot,最后是实际的表名。sql标准使用术语schema来表示informix所称的所有者。因此,在informix中,以下任何符号都可以标识一个表:
table "owner".table dbase:table dbase:owner.table dbase@server:table dbase@server:owner.table
业主一般不需要报价;但是,如果使用引号,则需要正确拼写所有者名称-它将区分大小写。即:
someone.table "someone".table SOMEONE.table
它们都标识同一个表。对于informix,模式ansi数据库有一点复杂,所有者名称通常转换为大写(informix是例外)。也就是说,在模式ansi数据库(不常用)中,您可以编写:
CREATE TABLE someone.table ( ... )
系统目录中的所有者名称应该是“someone”,而不是“someone”。如果将所有者名称括在双引号中,则其作用类似于分隔标识符。对于标准sql,分隔标识符可以在许多地方使用。使用informix,您只能在所有者名称周围使用它们——在其他上下文中,informix将单引号和双引号字符串都视为字符串,而不是将单引号字符串分隔为字符串,将双引号字符串分隔为分隔标识符(当然,为了完整起见,有一个环境变量delimident,可以设置为任何值,但y是最安全的,它表示双引号总是环绕分隔标识符,单引号总是环绕字符串。)请注意,mssqlserver设法使用方括号中的[分隔标识符]。在我看来这很奇怪,而且肯定不是sql标准的一部分。
j1dl9f4614#
如果您想在表中插入一些数据而不想写入列名。
INSERT INTO CUSTOMER_INFO (SELECT CUSTOMER_NAME, MOBILE_NO, ADDRESS FROM OWNER_INFO cm)
表格所在位置:
CUSTOMER_INFO || OWNER_INFO ----------------------------------------||------------------------------------- CUSTOMER_NAME | MOBILE_NO | ADDRESS || CUSTOMER_NAME | MOBILE_NO | ADDRESS --------------|-----------|--------- || --------------|-----------|--------- A | +1 | DC || B | +55 | RR
结果:
CUSTOMER_INFO || OWNER_INFO ----------------------------------------||------------------------------------- CUSTOMER_NAME | MOBILE_NO | ADDRESS || CUSTOMER_NAME | MOBILE_NO | ADDRESS --------------|-----------|--------- || --------------|-----------|--------- A | +1 | DC || B | +55 | RR B | +55 | RR ||
rqcrx0a615#
对于microsoftsqlserver,我建议您学习解释msdn上提供的语法。使用google,查找语法比以往任何时候都容易。对于这种特殊情况,请尝试谷歌:插入site:microsoft.com第一个结果是http://msdn.microsoft.com/en-us/library/ms174335.aspx如果您发现很难解释页面顶部给出的语法,请向下滚动到示例(“使用select和execute选项插入其他表中的数据”)。
[ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCENT ] ] [ INTO ] { <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } { [ ( column_list ) ] [ <OUTPUT Clause> ] { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] | derived_table <<<<------- Look here ------------------------ | execute_statement <<<<------- Look here ------------------------ | <dml_table_source> <<<<------- Look here ------------------------ | DEFAULT VALUES } } } [;]
这应该适用于任何其他可用的rdbms。记住所有产品的所有语法是没有意义的。
26条答案
按热度按时间aelbi1ox1#
如果要使用插入所有列,可以尝试此操作
SELECT * INTO
table。bakd9h0s2#
这可以在不指定
INSERT INTO
如果要为SELECT
部分。假设table1有两列。此查询应适用于:
这不起作用(对于
col2
(未指定):我正在使用ms sql server。我不知道其他RDM是怎么工作的。
t1rydlwq3#
而不是
VALUES
部分INSERT
查询,只需使用SELECT
查询如下。olhwl3o24#
insert-into和select子查询的两种方法。
使用select子查询返回一行结果。
使用select子查询返回多行结果。
1使用select子查询返回一行结果的方法。
在这种情况下,它假设select子查询只返回一行基于where条件或sql聚合函数(如sum、max、avg等)的结果,否则它将抛出错误
2返回多行结果的with select子查询的方法。
第二种方法适用于这两种情况。
yvgpqqbh5#
下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个Map表:
(我意识到匹配学生姓名可能会返回多个值,但你明白了。当id是标识列且未知时,有必要对id以外的内容进行匹配。)
5vf7fwbs6#
在insert中使用select子句的括号即可。例如:
bwitn5fc7#
下面是另一个使用多个表获取源的示例:
zf2sa74q8#
表列顺序已知时的简单插入:
简单插入列:
当表(#table2)的选定列数等于插入表(table1)时进行批量插入
批量插入当您只想插入到表(表1)的所需列中时:
vwhgwdsa9#
apeeds0o10#
大多数数据库都遵循基本语法,
我使用的每个数据库都遵循这个语法,
DB2
,SQL Server
,MY SQL
,PostgresQL
wpx232ag11#
postgres支持下一步:创建表company.monitor2作为select*from company.monitor;
kgsdhlau12#
这对我有用:
这个句子和甲骨文的有点不同。
nhn9ugyo13#
我看到的这两个答案在informix中都能很好地工作,基本上都是标准sql。即符号:
可以很好地与informix和所有dbms配合使用(在5年或更长的时间以前,mysql并不总是支持这种东西;它现在对这种标准的sql语法有了很好的支持,而且,对这种表示法来说,它还可以工作。)列列表是可选的,但它按顺序指示目标列,因此select结果的第一列将进入第一列,以此类推,在没有列列表的情况下,select结果的第一列进入目标表的第一列。
不同系统之间的区别在于用于标识不同数据库中的表的符号-该标准对数据库间(更不用说数据库间)操作没有任何规定。对于informix,您可以使用以下符号来标识表:
也就是说,您可以指定一个数据库,如果该数据库不在当前服务器中,可以选择标识承载该数据库的服务器,后跟可选的所有者dot,最后是实际的表名。sql标准使用术语schema来表示informix所称的所有者。因此,在informix中,以下任何符号都可以标识一个表:
业主一般不需要报价;但是,如果使用引号,则需要正确拼写所有者名称-它将区分大小写。即:
它们都标识同一个表。对于informix,模式ansi数据库有一点复杂,所有者名称通常转换为大写(informix是例外)。也就是说,在模式ansi数据库(不常用)中,您可以编写:
系统目录中的所有者名称应该是“someone”,而不是“someone”。如果将所有者名称括在双引号中,则其作用类似于分隔标识符。对于标准sql,分隔标识符可以在许多地方使用。使用informix,您只能在所有者名称周围使用它们——在其他上下文中,informix将单引号和双引号字符串都视为字符串,而不是将单引号字符串分隔为字符串,将双引号字符串分隔为分隔标识符(当然,为了完整起见,有一个环境变量delimident,可以设置为任何值,但y是最安全的,它表示双引号总是环绕分隔标识符,单引号总是环绕字符串。)
请注意,mssqlserver设法使用方括号中的[分隔标识符]。在我看来这很奇怪,而且肯定不是sql标准的一部分。
j1dl9f4614#
如果您想在表中插入一些数据而不想写入列名。
表格所在位置:
结果:
rqcrx0a615#
对于microsoftsqlserver,我建议您学习解释msdn上提供的语法。使用google,查找语法比以往任何时候都容易。
对于这种特殊情况,请尝试
谷歌:插入site:microsoft.com
第一个结果是http://msdn.microsoft.com/en-us/library/ms174335.aspx
如果您发现很难解释页面顶部给出的语法,请向下滚动到示例(“使用select和execute选项插入其他表中的数据”)。
这应该适用于任何其他可用的rdbms。记住所有产品的所有语法是没有意义的。