我正在努力 INSERT INTO 使用另一个表的输入的表。尽管这对于许多数据库引擎是完全可行的,但我似乎总是很难记住 SQL 今天的引擎(mysql、oracle、sqlserver、informix和db2)。是否有一个来自sql标准(例如sql-92)的银弹语法允许我插入值而不必担心底层数据库?
INSERT INTO
SQL
pcww981p1#
下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个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'
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以外的内容进行匹配。)
irlmq6kh2#
postgres支持下一步:创建表company.monitor2作为select*from company.monitor;
ssgvzors3#
在informix中,正如claude所说:
INSERT INTO table (column1, column2) VALUES (value1, value2);
INSERT INTO table (column1, column2)
VALUES (value1, value2);
t2a7ltrp4#
如果使用“插入值”路径插入多行,请确保使用括号将值分隔为多个集合,以便:
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');
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行的值计数不匹配”,当您最终确定如何处理它时,您将编写一篇无关紧要的文章。
zkure5ic5#
如果您想在表中插入一些数据而不想写入列名。
INSERT INTO CUSTOMER_INFO (SELECT CUSTOMER_NAME, MOBILE_NO, ADDRESS FROM OWNER_INFO cm)
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
结果:
CUSTOMER_INFO || OWNER_INFO----------------------------------------||-------------------------------------CUSTOMER_NAME | MOBILE_NO | ADDRESS || CUSTOMER_NAME | MOBILE_NO | ADDRESS --------------|-----------|--------- || --------------|-----------|--------- A | +1 | DC || B | +55 | RR B | +55 | RR ||
B | +55 | RR ||
gjmwrych6#
select *into tmpfrom orders
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
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
vcirk6k67#
插入任何其他表中的多条记录的最佳方法。
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)
INSERT INTO dbo.Users
( UserID ,
Full_Name ,
Login_Name ,
Password
)
SELECT UserID ,
FROM Users_Table
(INNER JOIN / LEFT JOIN ...)
(WHERE CONDITION...)
(OTHER CLAUSE)
xyhw6mcr8#
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)SELECT COLUMN_NAMEFROM ANOTHER_TABLE_NAME WHERE CONDITION;
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT COLUMN_NAME
FROM ANOTHER_TABLE_NAME
WHERE CONDITION;
ijxebb2r9#
对于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 } }}[;]
[ 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。记住所有产品的所有语法是没有意义的。
jljoyd4f10#
这对我有用:
insert into table1 select * from table2
这个句子和甲骨文的有点不同。
j91ykkif11#
实际上,我更喜欢sql server 2008中的以下内容:
SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeIntINTO Table3FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3
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()集的步骤,只需选择表中的值。
yzxexxkh12#
如果要使用插入所有列,可以尝试此操作 SELECT * INTO table。
SELECT * INTO
SELECT *INTO Table2FROM Table1;
SELECT *
INTO Table2
FROM Table1;
0yycz8jy13#
INSERT INTO yourtableSELECT fielda, fieldb, fieldcFROM donortable;
INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;
这适用于所有dbms
iyfjxgzm14#
尝试:
INSERT INTO table1 ( column1 )SELECT col1FROM table2
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
这是标准的ansisql,应该适用于任何dbms它绝对适用于:Oraclems sql服务器mysql数据库博士后sqlite v3版天睿资讯db2公司赛贝斯眩晕hsqldb公司氢气aws红移sap hana公司谷歌扳手
wbgh16ku15#
下面是另一个使用多个表获取源的示例:
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;
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 ,
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;
26条答案
按热度按时间pcww981p1#
下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个Map表:
(我意识到匹配学生姓名可能会返回多个值,但你明白了。当id是标识列且未知时,有必要对id以外的内容进行匹配。)
irlmq6kh2#
postgres支持下一步:创建表company.monitor2作为select*from company.monitor;
ssgvzors3#
在informix中,正如claude所说:
t2a7ltrp4#
如果使用“插入值”路径插入多行,请确保使用括号将值分隔为多个集合,以便:
否则mysql对象“列计数与第1行的值计数不匹配”,当您最终确定如何处理它时,您将编写一篇无关紧要的文章。
zkure5ic5#
如果您想在表中插入一些数据而不想写入列名。
表格所在位置:
结果:
gjmwrych6#
看起来不错,但只有在tmp不存在时才有效(创建并填充它)(sql服务器)
要插入到现有tmp表中,请执行以下操作:
vcirk6k67#
插入任何其他表中的多条记录的最佳方法。
xyhw6mcr8#
ijxebb2r9#
对于microsoftsqlserver,我建议您学习解释msdn上提供的语法。使用google,查找语法比以往任何时候都容易。
对于这种特殊情况,请尝试
谷歌:插入site:microsoft.com
第一个结果是http://msdn.microsoft.com/en-us/library/ms174335.aspx
如果您发现很难解释页面顶部给出的语法,请向下滚动到示例(“使用select和execute选项插入其他表中的数据”)。
这应该适用于任何其他可用的rdbms。记住所有产品的所有语法是没有意义的。
jljoyd4f10#
这对我有用:
这个句子和甲骨文的有点不同。
j91ykkif11#
实际上,我更喜欢sql server 2008中的以下内容:
它消除了添加insert()集的步骤,只需选择表中的值。
yzxexxkh12#
如果要使用插入所有列,可以尝试此操作
SELECT * INTO
table。0yycz8jy13#
这适用于所有dbms
iyfjxgzm14#
尝试:
这是标准的ansisql,应该适用于任何dbms
它绝对适用于:
Oracle
ms sql服务器
mysql数据库
博士后
sqlite v3版
天睿资讯
db2公司
赛贝斯
眩晕
hsqldb公司
氢气
aws红移
sap hana公司
谷歌扳手
wbgh16ku15#
下面是另一个使用多个表获取源的示例: