如何使用查找的值将记录插入 SQL?
Posted
技术标签:
【中文标题】如何使用查找的值将记录插入 SQL?【英文标题】:How to insert records to SQL with looked up values? 【发布时间】:2011-11-27 17:10:20 【问题描述】:场景
我需要每天通过电子表格更新 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
【问题讨论】:
您打算如何将电子表格数据导入 sql-server? 【参考方案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 语句,它就可以工作。
【讨论】:
【参考方案2】:插入表的数据源定义为
VALUES ( DEFAULT | NULL | expression [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
所以我们可以使用定义为的派生表
派生表
是任何返回数据行的有效 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
这将允许您删除当前正在考虑执行的循环。
【讨论】:
这比 BryceAtNetwork23 的答案更好,这对我来说似乎更简单? (尽管两个答案都有效) 如果您要一次处理一个记录,它们是相同的。如果您使用临时表或 OPENDATASOURCE 一次处理它们,那么您必须使用 derived_table 明白,感谢您的帮助。很遗憾,我无法使用您的方法。【参考方案3】:您是否尝试过使用 SELECT INTO 语句?这允许您从一个表中选择数据并将其插入到另一个表中。
http://www.w3schools.com/sql/sql_select_into.asp
【讨论】:
SELECT INTO 创建一个表以上是关于如何使用查找的值将记录插入 SQL?的主要内容,如果未能解决你的问题,请参考以下文章