我试图使用另一个表的输入将数据插入到表中。尽管这对于许多数据库引擎来说是完全可行的,但我似乎总是很难记住当前SQL引擎(MySQL、Oracle、SQL Server、Informix和DB2)的正确语法。
是否有来自SQL标准(例如SQL-92)的银弹语法允许我插入值而不必担心底层数据库?
我试图使用另一个表的输入将数据插入到表中。尽管这对于许多数据库引擎来说是完全可行的,但我似乎总是很难记住当前SQL引擎(MySQL、Oracle、SQL Server、Informix和DB2)的正确语法。
是否有来自SQL标准(例如SQL-92)的银弹语法允许我插入值而不必担心底层数据库?
当前回答
以下是如何从多个表中插入。这个特定的示例是在多对多场景中有一个映射表:
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以外的其他值上进行匹配。)
其他回答
如果要为SELECT部分中的所有列提供值,则可以在不指定INSERT INTO部分中的列的情况下执行此操作。
假设表1有两列。此查询应该可以:
INSERT INTO table1
SELECT col1, col2
FROM table2
这将不起作用(未指定col2的值):
INSERT INTO table1
SELECT col1
FROM table2
我正在使用MS SQL Server。我不知道其他RDMS是如何工作的。
Claude Houle的回答是:应该可以正常工作,也可以有多个列和其他数据:
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一起工作。
这对我有用:
insert into table1 select * from table2
这句话和甲骨文的有点不同。
使用select子查询插入的两种方法。
SELECT子查询返回一行结果。SELECT子查询返回多行结果。
1.With 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>;
第二种方法适用于这两种情况。
这是另一个使用带有select的值的示例:
INSERT INTO table1(desc, id, email)
SELECT "Hello World", 3, email FROM table2 WHERE ...