【问题标题】:How to insert records to SQL with looked up values?如何使用查找的值将记录插入 SQL?
【发布时间】: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?

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


【解决方案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 创建一个表
    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2020-06-27
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多