如何通过查找值将记录插入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
你可以尝试这样的事:
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语句它会工作。
谢谢!这个技巧简单而又甜美。 – Paul
您是否尝试过使用SELECT INTO语句?这使您可以从一个表中选择数据并将其插入另一个表中。
SELECT INTO *创建*表格 –
其插入到表数据的源被定义为
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
这将允许您删除您当前正在考虑的循环。
您打算如何将电子表格数据导入sql-server? –