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

是否有来自SQL标准(例如SQL-92)的银弹语法允许我插入值而不必担心底层数据库?


当前回答

Try:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

它绝对适用于:

神谕MS SQL ServerMySQL数据库Postgres公司SQLite v3Teradata公司分布式数据库Sybase公司Vertica公司hsql数据库氢气AWS红移萨普哈纳谷歌扳手

其他回答

要在第一个答案中添加一些内容,当我们只需要另一个表中的几个记录时(在本例中只有一个):

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

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中使用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'
);

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

这是另一个使用带有select的值的示例:

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