我试图使用另一个表的输入将数据插入到表中。尽管这对于许多数据库引擎来说是完全可行的,但我似乎总是很难记住当前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以外的其他值上进行匹配。)

其他回答

这对我有用:

insert into table1 select * from table2

这句话和甲骨文的有点不同。

如果您使用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行的值计数不匹配”,当您最终决定如何处理它时,您将写一篇微不足道的文章。

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

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

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

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)

如果要为SELECT部分中的所有列提供值,则可以在不指定INSERT INTO部分中的列的情况下执行此操作。

假设表1有两列。此查询应该可以:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

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