如何使用查找值将记录插入SQL?

时间:2011-11-27 17:10:21

标签: sql sql-server sql-server-2008 excel

方案

我需要每天通过电子表格更新SQL 2008数据库(唯一可用的选项)。格式非常基本,但可能有数百万条记录。 Column1和Column3将有许多预定义的重复值,已经被拉出到单独的表中。

电子表格示例

Column1 Column2 Column3
Apple   10      Red
Apple   20      Red
Apple   15      Blue
Apple   21      Green
Orange  10      Orange
Orange  7       Orange
Orange  9       Red
Orange  70      Blue
Orange  10      Blue

数据库设置

我的数据库设置有三个单独的表:

//Lookup_Column1
id type
1  Apple
2  Orange

//Lookup_Column3
id type
1  Red
2  Blue
3  Green
4  Orange

//Main - this is what should be inserted, after Column1
//and Column2 are matched to their respective ID's
key Column1 Column2 Column3
1   1       10      1
2   1       20      1
3   1       15      2
4   1       21      3
5   2       10      4
6   2       7       4
7   2       9       1
8   2       70      2
9   2       10      2

问题

如何编写SQL以插入与查找表中的信息匹配的记录?我怎么能这样做:

INSERT INTO Main(Column1, Column2) VALUES ('Apple', 10, 'Red');

对此:

INSERT INTO Main(Column1, Column2) VALUES (1, 10, 1);
//pulled from lookup tables, where Apple = 1 and Red = 1

3 个答案:

答案 0 :(得分:7)

您可以尝试这样的事情:

    INSERT INTO Main(Column1, Column2, Column3) VALUES 
    (
    (SELECT id FROM Lookup_Column1 WHERE type = 'Apple'),
    10, 
    (SELECT id FROM Lookup_Column3 WHERE type = 'Red')
    );

没有任何容错功能,但只要您可以将电子表格值解析为SELECT语句,它就会起作用。

答案 1 :(得分:2)

插入表中的数据源定义为

   VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] 
          | derived_table 
          | execute_statement
          | <dml_table_source>
          | DEFAULT VALUES 

所以我们可以使用一个被定义为

的derived_table
  

derived_table

     

是否有任何返回数据行的有效SELECT语句   被加载到表中。 SELECT语句不能包含   公用表表达式(CTE)。

 INSERT INTO 
   MAIN
 (Column1, Column2, column3)

 SELECT
   lc1.id,
   10,
   lc2.id
 FROM  
   Lookup_Column1 lc1,
   Lookup_Column2 lc2
  WHERE 
   lc1.type = 'Apple'
   and 
   lc2.type = 'Red'

有关详细信息,请参阅INSERT (Transact-SQL)

如果您可以将电子表格值放入临时表(或直接使用链接服务器或OPENDATASOURCE链接到电子表格),则可以将INSERT子句更改为

  INSERT INTO 
   MAIN
  ( Column1, Column2, column3)
 SELECT
   lc1.id,
   s.column2,
   lc2.id

 FROM  
   OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
           'Data Source=C:\YourdataSource.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] s
   INNER JOIN Lookup_Column1 lc1 
   ON s.column1 = lc1.type 
   INNER JOIN Lookup_Column2 lc2 
   ON s.column3 = lc2.type

这将允许您删除您当前正在考虑做的循环。

答案 2 :(得分:0)

您是否尝试过使用SELECT INTO语句?这允许您从一个表中选择数据并将其插入另一个表中。

http://www.w3schools.com/sql/sql_select_into.asp