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

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


当前回答

对于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部分中的列的情况下执行此操作。

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

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

使用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>;

第二种方法适用于这两种情况。

INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

这适用于所有DBMS

实际上,我更喜欢SQL Server 2008中的以下内容:

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()集的步骤,只需选择表中的值。

下面是使用多个表获取源的另一个示例:

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;