Как вставить записи в SQL с найденными значениями? - PullRequest
7 голосов
/ 27 ноября 2011

Сценарий

Мне нужно ежедневно обновлять базу данных 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 ]

7 голосов
/ 27 ноября 2011

Вы можете попробовать что-то вроде этого:

    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 голосов
/ 27 ноября 2011

Источник данных, вставленных в таблицу, определен как

   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

Это позволит вам удалитьцикл, о котором вы сейчас думаете.

0 голосов
/ 27 ноября 2011

Вы пытались использовать оператор SELECT INTO?Это позволяет выбирать данные из одной таблицы и вставлять их в другую.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...