我正在尝试使用另一个表的输入将表INSERT INTO到表中。 尽管对于许多数据库引擎来说这是完全可行的,但我似乎总是很难记住当今SQL引擎( MySQL , Oracle , SQL Server , Informix和DB2 )的正确语法。

是否有来自SQL标准(例如SQL-92 )的Silver-bullet语法,该语法可让我插入值而无需担心基础数据库?


#1楼

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

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)
SELECTPFl_EMP_CODE    ,PFl_DEPT_CODE   ,PFl_SEC         ,PFl_PROL_NO     ,PF_FM_SEQ       ,PF_SEQ_NO       ,PFl_SEP_TAG     ,PF_SOURCEFROM cesc_pf_stmt_ext,cesc_pfl_emp_masterWHERE pfl_sep_tag LIKE '0'AND pfl_emp_code=pf_emp_code(+);COMMIT;

#2楼

如果要为SELECT部分中的所有列提供值,则无需在INSERT INTO部分中指定列即可完成此操作。

假设table1有两列。 此查询应该工作:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

这将不起作用(未指定col2值):

INSERT INTO table1
SELECT  col1
FROM    table2

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


#3楼

对于Microsoft SQL Server,我将建议学习解释MSDN上提供的SYNTAX。 使用Google,查找语法比以往任何时候都容易。

对于这种特殊情况,请尝试

Google:插入网站: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。 记住所有产品IMO的所有语法是没有意义的。


#4楼

我看到的两个答案都特别适合在Informix中使用,并且基本上都是标准SQL。 即表示法:

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

与Informix以及所有DBMS配合使用都很好。 (从5年前开始,MySQL并不总是支持这种东西;现在,它已经对这种标准SQL语法提供了不错的支持,并且AFAIK可以在这种表示法上正常工作。)列列表是可选的,但按顺序指示目标列,因此SELECT结果的第一列将进入列出的第一列,依此类推。在没有列列表的情况下,SELECT结果的第一列将进入目标表的第一列。

系统之间的区别可能是用于标识不同数据库中的表的符号-该标准对数据库间(更不用说DBMS间)操作了无话可说。 使用Informix,可以使用以下表示法来标识表:

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

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

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

所有者通常不需要被报价; 但是,如果确实使用引号,则需要正确拼写所有者名称-区分大小写。 那是:

someone.table
"someone".table
SOMEONE.table

都标识同一张表。 使用Informix,使用MODE ANSI数据库会有一个轻度的麻烦,其中所有者名称通常会转换为大写(informix是例外)。 也就是说,在MODE ANSI数据库(不常用)中,您可以编写:

CREATE TABLE someone.table ( ... )

并且系统目录中的所有者名称将为“ SOMEONE”,而不是“ someone”。 如果将所有者名称用双引号引起来,则其作用类似于分隔标识符。 使用标准SQL,分隔符可以在很多地方使用。 使用Informix,您只能在所有者名称周围使用它们-在其他情况下,Informix会将单引号和双引号字符串都视为字符串,而不是将单引号字符串和字符串分开以及将双引号字符串作为分隔标识符。 (当然,出于完整性考虑,可以将环境变量DELIMIDENT设置为任意值,但Y最安全-表示双引号始终包围定界标识符,单引号始终包围字符串。)

请注意,MS SQL Server设法使用方括号中包含的[定界标识符]。 在我看来,这很奇怪,并且肯定不是SQL标准的一部分。


#5楼

我实际上更喜欢SQL Server 2008中的以下内容:

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

它省去了添加Insert()集的步骤,而您只需选择表中包含的值即可。


#6楼

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

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

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


#7楼

这为我工作:

insert into table1 select * from table2

该句子与Oracle的句子有些不同。


#8楼

为了从另一个表中的多值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))

#9楼

当表列顺序已知时,简单插入:

    Insert into Table1values(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

当您只想插入表(table1)的所需列时进行批量插入:

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  Select Column1,Column2..desired column from #table2from #table2

#10楼

这是另一个将值与select结合使用的示例:

INSERT INTO table1(desc, id, email)
SELECT "Hello World", 3, email FROM table2 WHERE ...

#11楼

select *
into tmp
from orders

看起来不错,但仅当tmp不存在(创建并填充)时才有效。 (SQL服务器)

插入现有的tmp表:

set identity_insert tmp oninsert tmp
([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],[ShipPostalCode],[ShipCountry] )select * from ordersset identity_insert tmp off

#12楼

尝试:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

这是标准的ANSI SQL,适用于任何DBMS

它绝对适用于:

  • 甲骨文
  • MS SQL服务器
  • 的MySQL
  • Postgres
  • SQLite v3
  • Teradata
  • DB2
  • Sybase公司
  • Vertica
  • 数据库
  • H2
  • AWS RedShift
  • SAP HANA

#13楼

@ Shadow_x99 :应该可以,并且您也可以有多个列和其他数据:

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

编辑:我应该提到,我只在Access,SQL 2000/2005 / Express,MySQL和PostgreSQL中使用了这种语法,因此应该将它们包括在内。 评论者指出它将与SQLite3一起使用。


#14楼

为了在第一个答案中添加一些内容,当我们只希望从另一个表中获取很少的记录时(在此示例中,仅一个):

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES (value1, value2,
(SELECT COLUMN_TABLE2
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

#15楼

代替INSERT查询的VALUES部分,只需使用SELECT查询,如下所示。

INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2

#16楼

INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

这适用于所有DBMS


#17楼

这是从多个表插入的方法。 此特定示例在多对多场景中都有一个映射表:

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是Identity列且未知时,必须在Id之外进行其他匹配。)


#18楼

如果要使用SELECT * INTO表插入所有列,可以尝试此操作。

SELECT  *
INTO    Table2
FROM    Table1;

#19楼

如果您使用INSERT VALUES路由插入多行,请确保使用括号将VALUES划分为集合,因此:

INSERT INTO `receiving_table`(id,first_name,last_name)
VALUES (1002,'Charles','Babbage'),(1003,'George', 'Boole'),(1001,'Donald','Chamberlin'),(1004,'Alan','Turing'),(1005,'My','Widenius');

否则,MySQL对象会出现“列数与第1行的值计数不匹配”的情况,最终当您弄清楚该怎么做时,您将写一篇琐碎的文章。


#20楼

INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME
WHERE CONDITION;

#21楼

从任何其他表插入多个记录的最佳方法。

INSERT  INTO dbo.Users( UserID ,Full_Name ,Login_Name ,Password)SELECT  UserID ,Full_Name ,Login_Name ,PasswordFROM    Users_Table(INNER JOIN / LEFT JOIN ...)(WHERE CONDITION...)(OTHER CLAUSE)

#22楼

只需对SELECT子句使用括号插入INSERT。 例如这样:

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'
);

#23楼

使用select子查询插入的两种方法。

  1. 使用SELECT子查询,返回结果为1行
  2. 使用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.使用SELECT子查询返回多行结果的方法。

INSERT INTO <table_name> (<field1>, <field2>, <field3>)
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

第二种方法适用于两种情况。

插入…值(SELECT…FROM…)相关推荐

  1. linq to sql 插入值,以及如何取回自增的ID

    linq to sql 在插入值的时候还是很方便.有时候我们需要在插入一个新的实体之后得到那个实体的主键ID的值,这个ID当然必须是自增.一段时间我一直认为直接使用linq to sql的插入机制是不 ...

  2. php代码正确 插不进表,在表中插入值在PHP中不工作,使用

    我正试图在表中插入值,我不知道到底发生了什么,它不起作用,我也看不到任何错误. 我不知道我在哪里犯了错误,有人能帮我吗? 这是我的代码: 数据库.php $host = 'localhost'; $d ...

  3. java mysql insert id_MySQL和Java-获取最后插入值的ID(JDBC)[重复]

    这个问题已经在这里有了答案 : 9年前关闭. 嗨,我正在使用JDBC通过Java连接数据库. 现在,我执行一些插入查询,并且需要获取最后插入值的ID(因此,在之后stmt.executeUpdate) ...

  4. python 在字典插入值和修改字典value值的方法

    字典插入值 使用update是字典增加内容 dict_a = {"a": "1", "b": "2", "c& ...

  5. SQL Server:向 SQL Server 自增字段插入值 (转)

    SQL Server:向 SQL Server 自增字段插入值 [鹏城万里] 发表于 www.sqlstudy.com 通常情况下,不能向 SQL Server 自增字段插入值,如果非要这么干的话,S ...

  6. SQL Server数据库自增字段正确的插入值的描述

    我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...

  7. sql语句往某个字段指定位置追加或者插入值

    sql语句往某个字段指定位置追加或者插入值 **业务场景:**需要对数据表中某个字段的值进行修改(对该字段的值进行插入字符串操作) 需要将materiel_features_pic字段值的'.png' ...

  8. hibernate映射数据库表如何在不插入值的情况下使表中字段默认值生效

    问题描述:    hibernate技术中对应数据库中每一个表,都会有一个映射文件与之对应,此文件描述数据库表中每一个字段的类型.长度.是否可空等属性.在进行表中记录的插入(更新)操作时,hibern ...

  9. 【转】mysql命令提示符显示中文乱码或插入值均为空白

    原文点击进入 如果是奔着解决问题而来,请直接跳到 四.5 希望能对你们有所帮助 一.前言 第一段话写给自己:早在一年多前,刚刚上手mysql的时候,就对windows命令行下的mysql中文乱码现象有 ...

最新文章

  1. nn.embding()使用注意点
  2. 25.2. String
  3. BAD PASSWORD 解决方法
  4. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
  5. Oracle中listener does not currently know of SID given in connect descriptor
  6. 这5条职场心机,句句真实,引发深思
  7. idea开启自动热部署自动化devtools
  8. 苹果Mac全新的文件启动方式:Hapigo
  9. Django中文文档-The Django Book
  10. 20190818 思维导图简易教程
  11. 高德地图导航,不显示地图只有语音
  12. Win10完美运行红色警戒2的安装包和补丁
  13. android 蒙版控件,Android开发UI之给ImageView添加蒙版
  14. html问号字符串,问号html
  15. matlab中分号、冒号、逗号等常用标点符号的作用
  16. 家用简单电线路图_这6张图在手,简单的家庭电路,电线还怕不会装?不存在的!...
  17. nginx报错问题记录
  18. html5画图论文结束语,基于HTML5 Canvas画图软件的设计与实现.doc
  19. PHP cdata 处理
  20. Scikit-plot画图

热门文章

  1. 设置为自动获得IP地址,如何查看当前的IP地址
  2. 编译安装LAMP环境
  3. using和名空间namespace
  4. 2008年下半年软件水平考试之程序员试题分析
  5. 2006毕业设计Delphi篇(二)
  6. 来点硬件知识吧,今天求职吃亏了!
  7. 聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2
  8. Jeesite 自定义api接口 404 访问不到页面
  9. BZOJ3240 NOI2013矩阵游戏(数论)
  10. 深入理解java中的线程池