我正在使用另一个表的输入来INSERT INTO
表。虽然这对许多数据库引擎完全可行,但我似乎总是很难记住当天SQL
引擎的正确语法(MySQL,Oracle,SQL Server, Informix和DB2)。
是否有来自SQL标准的银弹语法(例如,SQL-92)允许我插入值而不必担心底层数据库?
答案 0 :(得分:1445)
尝试:
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
这是标准的ANSI SQL,应该适用于任何DBMS
绝对适用于:
答案 1 :(得分:840)
@ 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一起使用。
答案 2 :(得分:109)
要从另一个表中获取多值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))
答案 3 :(得分:57)
我看到的答案在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标准使用术语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,MODE ANSI数据库有一个轻微的复杂性,其中所有者名称通常转换为大写(informix是例外)。也就是说,在MODE ANSI数据库(不常用)中,您可以编写:
CREATE TABLE someone.table ( ... )
并且系统目录中的所有者名称将是“SOMEONE”,而不是“某人”。如果将所有者名称括在双引号中,则它就像一个分隔标识符。使用标准SQL,可以在许多地方使用分隔标识符。使用Informix,您只能在所有者名称周围使用它们 - 在其他上下文中,Informix将单引号和双引号字符串视为字符串,而不是将单引号字符串分隔为字符串,将双引号字符串分隔为分隔标识符。 (当然,只是为了完整性,有一个环境变量,DELIMIDENT,可以设置 - 任何值,但Y是最安全的 - 表示双引号始终围绕分隔标识符,单引号始终包围字符串。)
请注意,MS SQL Server设法使用括在方括号中的[分隔标识符]。它看起来很奇怪,当然不是SQL标准的一部分。
答案 4 :(得分:29)
要在第一个答案中添加内容,当我们只需要来自另一个表的少量记录时(在此示例中只有一个):
INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES (value1, value2,
(SELECT COLUMN_TABLE2
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);
答案 5 :(得分:29)
大多数数据库都遵循基本语法
INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;
我使用的每个数据库都遵循这种语法,即DB2
,SQL Server
,MY SQL
,PostgresQL
答案 6 :(得分:23)
如果要为INSERT INTO
部分中的所有列提供值,则可以在不指定SELECT
部分中的列的情况下完成此操作。
假设table1有两列。此查询应该有效:
INSERT INTO table1
SELECT col1, col2
FROM table2
这不起作用(未指定col2
的值):
INSERT INTO table1
SELECT col1
FROM table2
我正在使用MS SQL Server。我不知道其他RDMS是如何工作的。
答案 7 :(得分:20)
而不是VALUES
部分INSERT
查询,只需使用SELECT
查询,如下所示。
INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2
答案 8 :(得分:19)
这是使用select:
的值的另一个示例INSERT INTO table1(desc, id, email)
SELECT "Hello World", 3, email FROM table2 WHERE ...
答案 9 :(得分:18)
表列序列已知时的简单插入:
Insert into Table1
values(1,2,...)
简单插入提示栏:
Insert into Table1(col2,col4)
values(1,2)
当表(#table2)的所选列数等于插入表(表1)时批量插入
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 #table2
from #table2
答案 10 :(得分:13)
这是另一个使用多个表获取源的示例:
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;
答案 11 :(得分:13)
这里是如何从多个表中插入的。这个特定示例是您在多对多场景中拥有映射表的地方:
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之外的其他内容。)
答案 12 :(得分:12)
如果要使用SELECT * INTO
表插入所有列,可以尝试此操作。
SELECT *
INTO Table2
FROM Table1;
答案 13 :(得分:12)
INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;
这适用于所有DBMS
答案 14 :(得分:11)
这对我有用:
insert into table1 select * from table2
这句话与甲骨文有点不同。
答案 15 :(得分:11)
对于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的所有语法都没有意义。
答案 16 :(得分:10)
我实际上更喜欢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()集的步骤,您只需选择表中的值。
答案 17 :(得分:9)
只需在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'
);
答案 18 :(得分:8)
select *
into tmp
from orders
看起来不错,但只有在tmp不存在(创建并填充)时才有效。 (SQL服务器)
要插入现有的tmp表:
set identity_insert tmp on
insert tmp
([OrderID]
,[CustomerID]
,[EmployeeID]
,[OrderDate]
,[RequiredDate]
,[ShippedDate]
,[ShipVia]
,[Freight]
,[ShipName]
,[ShipAddress]
,[ShipCity]
,[ShipRegion]
,[ShipPostalCode]
,[ShipCountry] )
select * from orders
set identity_insert tmp off
答案 19 :(得分:7)
从任何其他表插入多个记录的最佳方法。
INSERT INTO dbo.Users
( UserID ,
Full_Name ,
Login_Name ,
Password
)
SELECT UserID ,
Full_Name ,
Login_Name ,
Password
FROM Users_Table
(INNER JOIN / LEFT JOIN ...)
(WHERE CONDITION...)
(OTHER CLAUSE)
答案 20 :(得分:6)
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT COLUMN_NAME
FROM ANOTHER_TABLE_NAME
WHERE CONDITION;
答案 21 :(得分:6)
如果您想在表中插入一些数据而又不想写列名。
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 ||
答案 22 :(得分:1)
使用select子查询插入的两种方法。
1。用SELECT子查询返回结果的结果是一行。
aws s3 sync
在这种情况下,假定SELECT子查询仅基于WHERE条件或SQL聚合函数(如SUM,MAX,AVG等)返回仅一行结果,否则将引发错误
2。使用SELECT子查询返回具有多行的结果的方法。
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
第二种方法对两种情况都适用。
答案 23 :(得分:0)
如果你先创建表,你可以这样使用;
select * INTO TableYedek From Table
这会插入值,但与创建新副本表不同。
答案 24 :(得分:0)
INSERT INTO Table_Name (COL1, COL2, COL3, ...)
VALUES (Value1, Value2, Value3, ...);
使用模式名称(如在 PostgreSQL 中):
INSERT INTO "Schema-name"."Table_Name" (COL1, COL2, COL3, ...)
VALUES (Value1, Value2, Value3, ...);
答案 25 :(得分:0)
Postgres支持以下内容: 创建表company.monitor2作为select * from company.monitor;
答案 26 :(得分:0)
在informix中,它像克洛德所说的那样工作:
INSERT INTO table (column1, column2)
VALUES (value1, value2);
答案 27 :(得分:0)
如果你去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对象&#34;列数与第1行和第34行的值计数不匹配,当你最终弄清楚如何处理它时,你最终会写一个简单的帖子。