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

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


当前回答

INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

其他回答

只需在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'
);

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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

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

如果要使用SELECT*INTO表插入所有列,可以尝试此操作。

SELECT  *
INTO    Table2
FROM    Table1;

对于Microsoft SQL Server,我建议您学习解释MSDN上提供的语法。使用谷歌,查找语法比以往任何时候都容易。

对于这种特殊情况,请尝试

谷歌:插入网址: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的所有语法是没有意义的。

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

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