2011-11-27 57 views
5

场景如何通过查找值将记录插入SQL?

我需要通过电子表格(唯一可用的选项)每天更新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 

DB设置

我的数据库设置了三个独立的表:

//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 
+0

您打算如何将电子表格数据导入sql-server? –

回答

5

你可以尝试这样的事:

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语句它会工作。

+0

谢谢!这个技巧简单而又甜美。 – Paul

2

其插入到表数据的源被定义为

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

因此,我们可以使用,其定义为

derived_table一个derived_table

是否返回任何有效的SELECT语句s行数据 被加载到表中。 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 

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

+0

这比BryceAtNetwork23的答案更好,这对我来说似乎更简单? (尽管两个答案都有效) – Paul

+0

如果您要一次处理一条记录,它们是一样的。如果您使用临时表或OPENDATASOURCE一次处理它们,那么您必须使用derived_table –

+0

了解,并感谢您的帮助。不幸的是,你的方法不适用于我。 – Paul